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