Кастомные слои Keras / keras 6

Нейронная сеть — это стек из слоев. Каждый из них получает входящие данные, делает вычисления и передает результат следующему. В Keras есть много встроенных слоев. Например, Conv2D, MaxPooling2D, Dense и Flatten имеют по несколько сценариев использования, но их нужно применять в соответствии с определенными требованиями. Однако иногда может потребоваться делать вычисления, которые не связаны с тем, что умеет Keras.

В таком случае нужно будет создать собственный слой и определить алгоритм для вычислений на основе входящих данных. В Keras есть инструмент для создания кастомных слоев. В этом материале разберемся, что они собой представляют и рассмотрим примеры построения таких слоев.

Кастомные слои Keras можно добавить двумя путями:

  • Лямбда-слой
  • Кастомный слой класса

Лямбда-слой в Keras

Лямбда-слои используются в Keras в тех случаях, когда нет нужды добавлять веса предыдущему слою. Этот слой создается для простых операций. Он напоминает лямбда-функции.

Сперва определяется функция, принимающая предыдущий слой в качестве источника входящих данных, затем выполняются вычисления, и возвращаются обновленные тензоры. После этого функция передается кастомному лямбда-слою.

Самое распространенное применение лямбда-слоя — определение собственной функции активации.

Предположим, нужно определить собственную функцию активации ReLU с помощью лямбда-слоя.

from keras.layer import Lambda
from keras import backend as K

def custom_function(input):
  return K.maximum(0.,input)

lambda_output = Lambda(custom_function)(input)

Этого достаточно для создания.

После этого слой добавляется в модель тем же способом, что и остальные.

model.add(lambda_output)

Кастомный слой класса в Keras

А теперь создадим собственный слой с весами. Для этого нужно реализовать четыре метода:

  • __init__инициализируется переменная класса и переменная суперкласса
  • build(input_shape) — определяются веса
  • call(x) — определяется алгоритм вычислений. В качестве аргумента принимается тензор
  • compute_output_shape(input_shape) — определяется форма вывода слоя

Рассмотрим получившуюся реализацию:

from keras import backend as K
from keras.layers import Layer

class custom_layer(Layer):
  def  __init__(self,output_dim,**kwargs):
    self.output_dim=output_dim
    super(custom_layer,self).__init__(**kwargs)

  def build(self,input_shape):
    self.W=self.add_weight(name=’kernel’,
                           shape=(input_shape[1],
                           self.output_dim),
                           initializer=’uniform’,
                           trainable=True)
    self.built = True
    
  def call(self,x):
    return K.dot(x,self.W)

  def compute_output_shape(self,input_shape):
    return (input_shape[0], self.output_dim)

Здесь используется всего один тензор, но их можно передать несколько в одном списке.

Выводы

Эта статья посвящена принципам создания кастомных слоев Keras. Есть два способа: лямбда-слои и слои класса. Первые нужны для базовых операций, а вторые — для применения весов ко входящим данным.

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript