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
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")
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.