web-dev-qa-db-fra.com

Comment empiler plusieurs lstm dans keras?

J'utilise une bibliothèque d'apprentissage en profondeur et j'essaie d'empiler plusieurs LSTM sans succès ..

model = Sequential()
model.add(LSTM(100,input_shape =(time_steps,vector_size)))
model.add(LSTM(100))

Le code ci-dessus renvoie une erreur à la troisième ligne Exception: Input 0 is incompatible with layer lstm_28: expected ndim=3, found ndim=2

L'entrée X est un tenseur de forme (100,250,50). Je suis en cours d'exécution keras sur backend tensorflow

32
Tamim Addari

Vous devez ajouter return_sequences=True à la première couche pour que son tenseur de sortie ait ndim=3 (c'est-à-dire la taille du lot, les pas de temps, l'état masqué).

Veuillez voir l'exemple suivant:

# 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'))

De: https://keras.io/getting-started/sequential-model-guide/ (recherchez "stacked lstm")

55
Daniel Adiwardana

Explication détaillée de la réponse de @DanielAdiwardana . Nous devons ajouter return_sequences = True pour toutes les couches LSTM, à l'exception de la dernière. 

Définir cet indicateur sur True permet à Keras de savoir que la sortie LSTM doit contenir toutes les sorties générées par l'historique, ainsi que des horodatages (3D). Ainsi, la prochaine couche LSTM peut continuer à fonctionner sur les données.

Si cet indicateur est false, LSTM ne renvoie que la dernière sortie (2D). Une telle sortie est pas suffisant pour une autre couche LSTM.

# 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'))

Sur le côté NOTE :: dernier calque dense est ajouté pour obtenir la sortie au format demandé par l'utilisateur. Dense (10) signifie ici que 10 sorties de classes différentes seront générées à l'aide de l'activation softmax. 

Si vous utilisez LSTM pour série chronologique, vous devriez alors avoir Dense (1). Ainsi, une seule sortie numérique est donnée.

1
shantanu pathak