Mehrfachausgabe für Multi-Step-Ahead-Vorhersage mit LSTM mit Keras

7

Ich bin neu in Deep Learning und LSTM (mit Keras). Ich versuche, eine mehrreihige Vorhersage von Zeitreihen zu lösen. Ich habe 3 Zeitreihen: A, B und C und möchte die Werte von C vorhersagen. Ich trainiere ein LSTM, das Datenpunkte mit 3 Schritten zurückspeist, um die nächsten 3 Schritte in der Zukunft vorherzusagen. Die Eingabedaten sehen wie folgt aus:

X = [[[A0, B0, C0],[A1, B1, C1],[A2, B2, C2]],[[ ...]]]

mit Abmessungen : (1000, 3, 3). Die Ausgabe ist:

y = [[C3, C4, C5],[C4, C5, C6],...]

mit Abmessungen : (1000, 3).

Ich benutze ein einfaches LSTM mit 1 versteckten Schicht (50 Neuronen). Ich habe ein LSTM mit Keras eingerichtet als:

n_features = 3
neurons = 50
ahead = 3
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Dense(input_dim=neurons, output_dim=ahead))
model.add(Activation('linear'))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

Dieses Modell funktioniert gut. Jetzt möchte ich auch die Werte von B vorhersagen (unter Verwendung derselben Eingabe). Deshalb habe ich versucht, die Ausgabe auf ähnliche Weise umzugestalten wie für das Training mit mehreren Funktionen:

 y = [[[B3, C3],[B4, C4],[B5, C5]],[[ ...]]]

so dass es Abmessungen hat : (1000, 3, 2). Dies gibt mir jedoch einen Fehler:

Error when checking target: expected activation_5 to have 2 dimensions, 
but got array with shape (1000, 3, 2)

Ich denke, die Struktur des Netzwerks muss sich ändern. Ich habe versucht, model.add(Dense(input_dim=neurons, output_dim=ahead))ohne Erfolg zu ändern . Soll ich das yanders umformen ? Ist die Struktur des Netzwerks falsch?

NCL
quelle
Ich arbeite auch an einem ähnlichen Problem. Können Sie mich bitte konsultieren, wie Sie Ihre Daten so aufbereitet haben? X = [[[A0, B0, C0], [A1, B1, C1], [A2, B2, C2]], [[...]]]? Ich habe auch die Frage: Als Sie die nächsten 3 Punkte prognostizierten, haben Sie die vorherigen 3 verwendet? Aber wenn Sie den 5. prognostizieren möchten, haben Sie den prognostizierten 4. verwendet? Vielen Dank im Voraus?
Osaozz
Ändern Sie die Ausgabe der letzten dichten Ebene auf 3, um das Problem zu lösen
Kaustabh Ganguly
Wenn Sie immer dieselbe Länge eingeben und dieselbe Länge ausgeben, benötigen Sie keine RNN und erzielen möglicherweise bessere Ergebnisse, wenn Sie sie nicht verwenden.
Kbrose

Antworten:

1
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Flatten())
model.add(Dense(ahead))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

Die Unterschiede umfassen:

  • Ich reduziere die Ausgabe von LSTM, weil es für dieses Szenario einen 3D-Tensor und eine dichte Ebene geben wird. Ich glaube, dass ein 2D-Tensor erwartet wird.
  • Die Änderung wurde in einer anderen Antwort vorgeschlagen .
  • Die Aktivierungsschicht wurde entfernt, da die Standardaktivierung der dichten Keras-Schicht ist linear.
Tenshi
quelle