4
votes

Implémentation de LSTM dans Keras

J'utilise Keras en utilisant le backend Tensorflow.

model = Sequential()
model.add(Masking(mask_value = 0., input_shape = (MAX_LENGTH, 1)))
model.add(LSTM(16, input_shape = (BATCH_SIZE, MAX_LENGTH, 1), return_sequences = False))
model.add(Dense(units = 2))
model.add(Activation("sigmoid"))
model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ["accuracy"])

Ce code python fonctionne, mais je me demande s'il y a 16 blocs LSTM avec 1 cellule chacun, ou 1 bloc LSTM avec 16 cellules.

Merci d'avance!

Architecture LSTM


0 commentaires

3 Réponses :


1
votes

C'est pour 1 bloc, 16 cellules, afaik.


0 commentaires

1
votes

Lorsque vous utilisez des cellules LSTM, GRU , vous n'avez pas la notion de couches en soi. Ce que vous avez en fait est une cellule, qui implémente peu de portes. Chacune des portes constitue une matrice de poids distincte que le modèle apprendra pendant l'entraînement. Par exemple, dans votre cas, vous aurez 1 cellule, où chacune des portes définies par les matrices aura une dimension (feature_size_of_your_input, 16) . Je vous suggère de lire: http://colah.github.io/posts / 2015-08-Understanding-LSTMs / très attentivement avant de commencer à implémenter ce genre de choses. Sinon, vous les utilisez simplement comme modèle de boîte noire sans comprendre ce qui se passe sous le capot.


1 commentaires

Merci pour votre réponse et désolé pour ma mauvaise explication. Il peut y avoir un problème de terminologie, mais j'ai peur de vous demander si votre «cellule» correspond à «bloc» dans l'image ci-dessus et votre «bloc» correspond également à une «couche».



3
votes

D'accord, votre question m'a fait réfléchir et je pense que je l'ai fait mais ici, rien ne va. Voici un extrait de code que j'ai créé pour obtenir des informations sur l'implémentation de LSTM.

In [26]: model.weights
Out[26]: 
[<tf.Variable 'lstm_4/kernel:0' shape=(30, 40) dtype=float32_ref>,
 <tf.Variable 'lstm_4/recurrent_kernel:0' shape=(10, 40) dtype=float32_ref>,
 <tf.Variable 'lstm_4/bias:0' shape=(40,) dtype=float32_ref>]

Maintenant, en inspectant les formes de poids, nous pouvons avoir une intuition sur ce qui se passe.

In [12]: weights[0].shape
Out[12]: (30, 40)
In [14]: weights[1].shape
Out[14]: (10, 40)
In [15]: weights[2].shape
Out[15]: (40,)

Et voici une description d'eux:

from keras.layers import LSTM
from keras.models import Sequential

model = Sequential()
model.add(LSTM(10, input_shape=(20, 30), return_sequences=True))
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
weights = model.get_weights()

Ce sont les seuls poids disponibles. Je suis également allé voir l'implémentation de Keras sur https : //github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1765

Donc vous pouvez voir que @gorjan avait raison, il en implémente un cellule, c'est-à-dire les 4 portes (pour l'entrée récurrente ainsi que pour l'entrée de séquence), ainsi que leurs biais.

La pensée de "couche" ici devrait être appliquée au nombre de fois où le LSTM sera déroulé , dans ce cas 30.

J'espère que cela vous aidera.


3 commentaires

J'apprécie ton aide. Maintenant, je comprends que keras implémente une cellule dont la dimension correspond au nombre d'unités. Certaines personnes appellent la dimension d'une cellule comme «nombre de cellules», donc j'étais coufusé. Dans votre exemple, le nombre d'unités est de 10, le nombre d'entités est de 30, le nombre de pas de temps est de 20, n'est-ce pas? J'ai donc peur de demander si le nombre de fois que le LSTM sera déroulé est de 20.


Oui, c'est déroutant. Vous pouvez considérer ces unités comme des «neurones» dans une couche dense standard car elles sont ensuite utilisées par des portes. Heureux d'avoir pu aider. Que diriez-vous de l'accepter comme réponse?


Oui, merci encore pour votre réponse.