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 
_________________________________________________________________