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
_________________________________________________________________