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?


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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.