Keras - Capa personalizada

Keras permite crear nuestra propia capa personalizada. Una vez que se crea una nueva capa, se puede usar en cualquier modelo sin ninguna restricción. Aprendamos a crear una nueva capa en este capítulo.

Keras proporciona una base layerclase, capa que se puede subclasificar para crear nuestra propia capa personalizada. Creemos una capa simple que encuentre el peso basado en la distribución normal y luego hagamos el cálculo básico de encontrar la suma del producto de entrada y su peso durante el entrenamiento.

Paso 1: Importa el módulo necesario

Primero, importemos los módulos necesarios:

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

Aquí,

  • backend se utiliza para acceder al dot función.

  • Layer es la clase base y la subclasificaremos para crear nuestra capa

Paso 2: definir una clase de capa

Creemos una nueva clase, MyCustomLayer subclasificando Layer class -

class MyCustomLayer(Layer): 
   ...

Paso 3: inicializar la clase de capa

Inicialicemos nuestra nueva clase como se especifica a continuación:

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

Aquí,

  • Line 2 establece la dimensión de salida.

  • Line 3 llama a la base o supercapa init función.

Paso 4: implementar el método de construcción

buildes el método principal y su único propósito es construir la capa correctamente. Puede hacer cualquier cosa relacionada con el funcionamiento interno de la capa. Una vez que se realiza la funcionalidad personalizada, podemos llamar a la clase basebuildfunción. Nuestra costumbrebuild la función es la siguiente:

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)

Aquí,

  • Line 1 define el build método con un argumento, input_shape. La forma de los datos de entrada se refiere a input_shape.

  • Line 2crea el peso correspondiente a la forma de entrada y lo establece en el kernel. Es nuestra funcionalidad personalizada de la capa. Crea el peso usando un inicializador 'normal'.

  • Line 6 llama a la clase base, build método.

Paso 5: implementar el método de llamada

call El método hace el trabajo exacto de la capa durante el proceso de entrenamiento.

Nuestra costumbre call el método es el siguiente

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

Aquí,

  • Line 1 define el call método con un argumento, input_data. input_data son los datos de entrada para nuestra capa.

  • Line 2 devolver el producto escalar de los datos de entrada, input_data y el núcleo de nuestra capa, self.kernel

Paso 6: implementar el método compute_output_shape

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

Aquí,

  • Line 1 define compute_output_shape método con un argumento input_shape

  • Line 2 calcula la forma de salida usando la forma de los datos de entrada y la dimensión de salida establecida mientras inicializa la capa.

Implementando el build, call y compute_output_shapecompleta la creación de una capa personalizada. El código final y completo es el siguiente

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 nuestra capa personalizada

Creemos un modelo simple usando nuestra capa personalizada como se especifica a continuación:

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

Aquí,

  • Nuestra MyCustomLayer se agrega al modelo usando 32 unidades y (16,) como forma de entrada

Al ejecutar la aplicación, se imprimirá el resumen del modelo como se muestra a continuación:

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 
_________________________________________________________________