95 votes

Comment empiler plusieurs lstm dans keras?

Je suis à l'aide de l'apprentissage en profondeur de la bibliothèque de keras et d'essayer de les empiler plusieurs LSTM avec pas de chance. Ci-dessous mon code

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

Le code ci-dessus renvoie l'erreur dans 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 tensorflow backend

156voto

Daniel Adiwardana Points 1384

Vous avez besoin d'ajouter return_sequences=True pour la première couche, de sorte que sa sortie tenseur a ndim=3 (c'est à dire la taille du lot, échéances, état caché).

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/ (de la recherche pour "empilés lstm")

24voto

shantanu pathak Points 111

Une explication détaillée de @DanielAdiwardana 's réponse. Nous avons besoin d'ajouter return_sequences=True pour tous les LSTM les calques sauf le dernier.

Cette option à True permet de Keras sais que LSTM sortie doit contenir tous les produits générés, ainsi que le temps de timbres (3D). Donc, la prochaine LSTM couche peut travailler sur les données.

Si ce drapeau est faux, alors LSTM retourne uniquement la dernière sortie (2D). Cette sortie n'est pas assez bon pour un autre LSTM couche.

# 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 une NOTE de côté :: dernière couche Dense est ajouté pour obtenir une sortie dans le format requis par l'utilisateur. Ici Dense(10) signifie que 10 classes différentes de sortie sera généré à l'aide de softmax d'activation.

Dans le cas où vous utilisez LSTM pour le temps de la série , alors vous devriez avoir Dense(1). De sorte qu'une seule sortie numérique est donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X