Ich verwende tiefe lernende Bibliothekskeras und versuche, mehrere LSTM ohne Erfolg zu stapeln
model = Sequential()
model.add(LSTM(100,input_shape =(time_steps,vector_size)))
model.add(LSTM(100))
Der obige Code gibt einen Fehler in der dritten Zeile aus. Exception: Input 0 is incompatible with layer lstm_28: expected ndim=3, found ndim=2
Der Eingang X ist ein Tensor der Form (100, 250, 50). Ich lasse Keras im Tensorflow-Backend laufen
Sie müssen return_sequences=True
zur ersten Ebene hinzufügen, damit der Ausgabe-Tensor ndim=3
(d. H. Stapelgröße, Zeitschritte, verborgener Status) enthält.
Bitte sehen Sie das folgende Beispiel:
# 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'))
Von: https://keras.io/getting-started/sequential-model-guide/ (Suche nach "stacked lstm")
Detaillierte Erklärung zur Antwort von @DanielAdiwardana . Wir müssen return_sequences = True für alle LSTM-Ebenen außer der letzten hinzufügen.
Wenn Sie dieses Flag auf True setzen, wird Keras darüber informiert, dass die LSTM-Ausgabe alle in der Vergangenheit generierten Ausgaben sowie Zeitstempel (3D) enthalten soll. Daher kann die nächste LSTM-Schicht kann weiter arbeiten für die Daten.
Wenn dieses Flag false ist, gibt LSTM nur die letzte Ausgabe zurück (2D). Diese Ausgabe ist nicht gut genug für eine andere LSTM-Schicht.
# 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'))
On side NOTE :: last Die dichte Ebene wird hinzugefügt, um die Ausgabe in einem vom Benutzer benötigten Format zu erhalten. Dense (10) bedeutet, dass 10 verschiedene Klassen ausgegeben werden, die die Softmax-Aktivierung verwenden.
Wenn Sie LSTM für Zeitreihe verwenden, sollten Sie Dense (1) haben. Damit wird nur eine numerische Ausgabe ausgegeben.