Keras - Camada Personalizada

Keras permite criar nossa própria camada personalizada. Depois que uma nova camada é criada, ela pode ser usada em qualquer modelo sem nenhuma restrição. Vamos aprender como criar uma nova camada neste capítulo.

Keras fornece uma base layerclasse, camada que pode ser subdividida para criar nossa própria camada personalizada. Vamos criar uma camada simples que encontrará o peso com base na distribuição normal e, em seguida, fazer o cálculo básico para encontrar a soma do produto da entrada e seu peso durante o treinamento.

Etapa 1: importe o módulo necessário

Primeiro, vamos importar os módulos necessários -

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

Aqui,

  • backend é usado para acessar o dot função.

  • Layer é a classe base e iremos subclassificá-la para criar nossa camada

Etapa 2: definir uma classe de camada

Vamos criar uma nova classe, MyCustomLayer por subclassificação Layer class -

class MyCustomLayer(Layer): 
   ...

Etapa 3: inicializar a classe de camada

Vamos inicializar nossa nova classe conforme especificado abaixo -

def __init__(self, output_dim, **kwargs):    
   self.output_dim = output_dim 
   super(MyCustomLayer, self).__init__(**kwargs)

Aqui,

  • Line 2 define a dimensão de saída.

  • Line 3 chama a base ou super camada init função.

Etapa 4: implemente o método de construção

buildé o método principal e seu único propósito é construir a camada corretamente. Ele pode fazer qualquer coisa relacionada ao funcionamento interno da camada. Assim que a funcionalidade personalizada estiver concluída, podemos chamar a classe basebuildfunção. Nosso costumebuild função é a seguinte -

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)

Aqui,

  • Line 1 define o build método com um argumento, input_shape. O formato dos dados de entrada é referido por input_shape.

  • Line 2cria o peso correspondente à forma de entrada e o define no kernel. É nossa funcionalidade personalizada da camada. Ele cria o peso usando o inicializador 'normal'.

  • Line 6 chama a classe base, build método.

Etapa 5: implemente o método de chamada

call método faz o trabalho exato da camada durante o processo de treinamento.

Nosso costume call método é o seguinte

def call(self, input_data): 
   return K.dot(input_data, self.kernel)

Aqui,

  • Line 1 define o call método com um argumento, input_data. input_data são os dados de entrada para nossa camada.

  • Line 2 retornar o produto escalar dos dados de entrada, input_data e o kernel da nossa camada, self.kernel

Etapa 6: Implementar o método compute_output_shape

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

Aqui,

  • Line 1 define compute_output_shape método com um argumento input_shape

  • Line 2 calcula a forma de saída usando a forma dos dados de entrada e o conjunto de dimensões de saída ao inicializar a camada.

Implementando o build, call e compute_output_shapeconclui a criação de uma camada personalizada. O código final e completo é o seguinte

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)

Usando nossa camada personalizada

Vamos criar um modelo simples usando nossa camada personalizada conforme especificado abaixo -

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()

Aqui,

  • Nosso MyCustomLayer é adicionado ao modelo usando 32 unidades e (16,) como forma de entrada

Executar o aplicativo imprimirá o resumo do modelo conforme abaixo -

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 
_________________________________________________________________