wake-up-neo.com

Wie stapeln Sie mehrere Lstm in Keras?

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

32
Tamim Addari

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

55

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.

1
shantanu pathak