Керас - индивидуальный слой

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 
_________________________________________________________________