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
_________________________________________________________________