Keras - Couche personnalisée
Keras permet de créer notre propre couche personnalisée. Une fois qu'un nouveau calque est créé, il peut être utilisé dans n'importe quel modèle sans aucune restriction. Apprenons à créer une nouvelle couche dans ce chapitre.
Keras fournit une base layerclasse, couche qui peut être sous-classée pour créer notre propre couche personnalisée. Créons une couche simple qui trouvera le poids en fonction de la distribution normale, puis effectuons le calcul de base pour trouver la somme du produit de l'entrée et de son poids pendant l'entraînement.
Étape 1: Importez le module nécessaire
Tout d'abord, importons les modules nécessaires -
from keras import backend as K
from keras.layers import Layer
Ici,
backend est utilisé pour accéder au dot fonction.
Layer est la classe de base et nous la sous-classerons pour créer notre couche
Étape 2: définir une classe de calque
Créons une nouvelle classe, MyCustomLayer par sous-classement Layer class -
class MyCustomLayer(Layer):
...
Étape 3: Initialisez la classe de couches
Initialisons notre nouvelle classe comme spécifié ci-dessous -
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)
Ici,
Line 2 définit la dimension de sortie.
Line 3 appelle la couche de base ou super couche init fonction.
Étape 4: implémenter la méthode de construction
buildest la méthode principale et son seul but est de construire correctement la couche. Il peut faire tout ce qui concerne le fonctionnement interne de la couche. Une fois la fonctionnalité personnalisée terminée, nous pouvons appeler la classe de basebuildfonction. Notre coutumebuild la fonction est la suivante -
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)
Ici,
Line 1 définit le build méthode avec un argument, input_shape. La forme des données d'entrée est référencée par input_shape.
Line 2crée le poids correspondant à la forme d'entrée et le définit dans le noyau. C'est notre fonctionnalité personnalisée de la couche. Il crée le poids en utilisant l'initialiseur «normal».
Line 6 appelle la classe de base, build méthode.
Étape 5: implémenter la méthode d'appel
call La méthode effectue le travail exact de la couche pendant le processus de formation.
Notre coutume call la méthode est la suivante
def call(self, input_data):
return K.dot(input_data, self.kernel)
Ici,
Line 1 définit le call méthode avec un argument, input_data. input_data est les données d'entrée de notre couche.
Line 2 renvoie le produit scalaire des données d'entrée, input_data et le noyau de notre couche, self.kernel
Étape 6: implémentation de la méthode compute_output_shape
def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
Ici,
Line 1 définit compute_output_shape méthode avec un argument input_shape
Line 2 calcule la forme de sortie à l'aide de la forme des données d'entrée et du jeu de dimensions de sortie lors de l'initialisation du calque.
Mettre en œuvre le build, call et compute_output_shapetermine la création d'un calque personnalisé. Le code final et complet est le suivant
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)
Utilisation de notre couche personnalisée
Créons un modèle simple en utilisant notre calque personnalisé comme spécifié ci-dessous -
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()
Ici,
Notre MyCustomLayer est ajouté au modèle en utilisant 32 unités et (16,) comme forme d'entrée
L'exécution de l'application imprimera le résumé du modèle comme ci-dessous -
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
_________________________________________________________________