Comprendre le paramètre input_shape dans LSTM avec Keras

20

J'essaie d'utiliser l'exemple décrit dans la documentation Keras nommée "LSTM empilé pour la classification de séquence" (voir le code ci-dessous) et input_shapeje ne peux pas comprendre le paramètre dans le contexte de mes données.

J'ai en entrée une matrice de séquences de 25 caractères possibles encodés en nombres entiers pour une séquence matelassée de longueur maximale 31. Par conséquent, ma x_traina la (1085420, 31)signification de la forme (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

Dans ce code x_traina la forme (1000, 8, 16), comme pour un tableau de 1000 tableaux de 8 tableaux de 16 éléments. Là, je suis complètement perdu sur ce qui est quoi et comment mes données peuvent atteindre cette forme.

En regardant le document Keras et divers didacticiels et questions / réponses, il semble que je manque quelque chose d'évident. Quelqu'un peut-il me donner une idée de ce qu'il faut rechercher?

Merci de votre aide !

mazieres
la source

Réponses:

23

Les formes LSTM sont difficiles, alors ne vous sentez pas mal, j'ai dû passer quelques jours à les combattre moi-même:

Si vous introduisez des données 1 caractère à la fois, votre forme d'entrée doit être (31,1) car votre entrée a 31 pas de temps, 1 caractère chacun. Vous devrez remodeler votre x_train de (1085420, 31) à (1085420, 31,1), ce qui se fait facilement avec cette commande:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
tRosenflanz
la source
2

Vérifiez ce diagramme récapitulatif LSTM Keras du référentiel git et je pense que vous devriez tout clarifier.

Ce dépôt git comprend un diagramme récapitulatif Keras LSTM qui montre:

  • l'utilisation de paramètres comme return_sequences, batch_size, time_step...
  • la structure réelle des couches lstm
  • le concept de ces couches en keras
  • comment manipuler vos données d'entrée et de sortie pour qu'elles correspondent aux exigences de votre modèle, comment empiler les couches de LSTM

Et plus

Mohammad Fneish
la source
Merci pour cela, @MohammadFneish. Il semble que ce serait plus utile maintenant. Cependant, il n'est pas clair que ce soit tout à fait une réponse à la question , par opposition à une suggestion utile. Sachez que Cross Validated est strictement un site de questions / réponses, pas un forum. Pouvez-vous ajouter [encore plus] d'informations pour expliquer le paramètre de forme d'entrée?
gung - Rétablir Monica
3
@gung, j'apprécie vraiment la façon dont vous parvenez à revoir ces réponses pour respecter les normes, mais je pense que je ne peux pas en dire plus sur ces paramètres là où il y a beaucoup de détails techniques le concernant. Je pense simplement que ma réponse pourrait être utile pour les développeurs confrontés à des problèmes similaires avec les entrées keras et pas nécessairement à ce problème particulier. Merci
Mohammad Fneish
1

Je sais que ce n'est pas une réponse directe à votre question. Il s'agit d'un exemple simplifié avec une seule cellule LSTM, qui m'aide à comprendre l'opération de remodelage des données d'entrée.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Ce serait un exemple du réseau LSTM avec juste une seule cellule LSTM et avec les données d'entrée de forme spécifique.

En fait, nous prédisons juste ici, la formation n'est pas présente pour plus de simplicité, mais regardez comment nous devions remodeler les données (pour ajouter une dimension supplémentaire) avant la predictméthode.

prosti
la source