Кастомные слои 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. Есть два способа: лямбда-слои и слои класса. Первые нужны для базовых операций, а вторые — для применения весов ко входящим данным.

Тест на знание python

Что выведет этот код?
Какие операторы можно использовать со строками?
Что выведет этот код?
Что выведет этот код?
Какая функция разворачивает список задом наперед?
Александр
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ. Пишу на популярные темы: веб-разработка, работа с базами данных, data sciense и другие...