Керас - индивидуальный слой
Keras позволяет создавать собственный индивидуальный слой. После создания нового слоя его можно использовать в любой модели без каких-либо ограничений. Давайте узнаем, как создать новый слой в этой главе.
Керас обеспечивает базу layerclass, Layer, который можно разделить на подклассы для создания нашего собственного настраиваемого слоя. Давайте создадим простой слой, который найдет вес на основе нормального распределения, а затем выполнит базовое вычисление по нахождению суммы произведения входных данных и его веса во время обучения.
Шаг 1. Импортируйте необходимый модуль
Во-первых, давайте импортируем необходимые модули -
from keras import backend as K
from keras.layers import Layer
Вот,
backend используется для доступа к dot функция.
Layer это базовый класс, и мы будем подклассифицировать его, чтобы создать наш слой
Шаг 2. Определите класс слоя
Давайте создадим новый класс, MyCustomLayer по подклассу Layer class -
class MyCustomLayer(Layer):
...
Шаг 3. Инициализируйте класс слоя
Давайте инициализируем наш новый класс, как указано ниже -
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)
Вот,
Line 2 устанавливает размер вывода.
Line 3 вызывает базовый или суперслой init функция.
Шаг 4. Реализуйте метод сборки
buildявляется основным методом, и его единственная цель - правильно построить слой. Он может делать все, что связано с внутренней работой слоя. Как только настраиваемые функции будут выполнены, мы можем вызвать базовый классbuildфункция. Наш обычайbuild функция выглядит следующим образом -
def build(self, input_shape):
self.kernel = self.add_weight(name = 'kernel',
shape = (input_shape[1], self.output_dim),
initializer = 'normal', trainable = True)
super(MyCustomLayer, self).build(input_shape)
Вот,
Line 1 определяет build метод с одним аргументом, input_shape. Форма входных данных обозначается input_shape.
Line 2создает вес, соответствующий входной форме, и устанавливает его в ядре. Это наша настраиваемая функциональность слоя. Он создает вес с помощью «обычного» инициализатора.
Line 6 вызывает базовый класс, build метод.
Шаг 5. Реализуйте метод вызова
call метод точно обрабатывает слой в процессе обучения.
Наш обычай call метод выглядит следующим образом
def call(self, input_data):
return K.dot(input_data, self.kernel)
Вот,
Line 1 определяет call метод с одним аргументом, input_data. input_data - это входные данные для нашего слоя.
Line 2 вернуть точечный продукт входных данных, input_data и ядро нашего слоя, self.kernel
Шаг 6. Реализуйте метод compute_output_shape
def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
Вот,
Line 1 определяет compute_output_shape метод с одним аргументом input_shape
Line 2 вычисляет выходную форму, используя форму входных данных и набор выходных размеров при инициализации слоя.
Реализация build, call и compute_output_shapeзавершает создание настраиваемого слоя. Окончательный и полный код выглядит следующим образом
from keras import backend as K from keras.layers import Layer
class MyCustomLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)
def build(self, input_shape): self.kernel =
self.add_weight(name = 'kernel',
shape = (input_shape[1], self.output_dim),
initializer = 'normal', trainable = True)
super(MyCustomLayer, self).build(input_shape) #
Be sure to call this at the end
def call(self, input_data): return K.dot(input_data, self.kernel)
def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
Используя наш настроенный слой
Давайте создадим простую модель, используя наш настроенный слой, как указано ниже -
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(MyCustomLayer(32, input_shape = (16,)))
model.add(Dense(8, activation = 'softmax')) model.summary()
Вот,
Наши MyCustomLayer добавляется к модели с использованием 32 единиц и (16,) как форма ввода
Запуск приложения распечатает сводку модели, как показано ниже -
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param
#================================================================
my_custom_layer_1 (MyCustomL (None, 32) 512
_________________________________________________________________
dense_1 (Dense) (None, 8) 264
=================================================================
Total params: 776
Trainable params: 776
Non-trainable params: 0
_________________________________________________________________