Ich versuche, ein einfaches LSTM/RNN zu kodieren. Gegeben ein sine
Eingang, kann ich das Signal cosine
voraussagen?LSTM/RNN Vorhersage Cosinus von Sinus
Während ich meinen Code ausführe, kann ich den nächsten Wert von sine
bei gegebenen historischen sine
Werten genau vorhersagen; aber ich bin nicht in der Lage, den nächsten Wert von cosine
gegebenen historischen sine
Werte genau vorherzusagen.
Ich habe stark von dieser following code example geliehen, die verwendet wird, um das nächste Zeichen aus dem Alphabet vorherzusagen.
Da ich einen LSTM/RNN verwende, definiere ich windows
(der Länge seq_length
) von Sequenzeingabedaten, die einem Ausgabedatenpunkt entsprechen.
Zum Beispiel
Eingangssequenz -> Ausgabe Sequence
[0, 0,00314198, 0,00628393, 0,00942582, 0,01256761] -> 1,0
In der obigen Probensequenz, sin(0)
ist 0, und dann haben wir die sine
Werte für die nächsten 4 Punkte. Diesen Werten ist cos(0)
zugeordnet.
Entsprechender Code,
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
time_points = np.linspace(0, 8*np.pi, 8000)
seq_length = 5
dataX = []
dataY = []
for i in range(0, len(time_points) - seq_length, 1):
seq_in = np.sin(time_points)[i:i + seq_length]
seq_out = np.cos(time_points)[i]
dataX.append([seq_in])
dataY.append(seq_out)
X = numpy.reshape(dataX, (len(dataX), seq_length, 1))
y = np.reshape(dataY, (len(dataY), 1))
LSTM Keras Code
model = Sequential()
model.add(LSTM(16, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(y.shape[1], activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X[:6000], y[:6000], epochs=20, batch_size=10, verbose=2, validation_split=0.3)
Die folgende Abbildung zeigt die Vorhersage und die Grundwahrheit, wenn wir versuchen, Cosinus von aufeinanderfolgenden Sinusdaten zu lernen.
Wenn wir jedoch unter Verwendung von Sinus- sequenziellen sine Daten lernen waren (d.h. seq_out = np.sin(time_points)[i]
hat), ist die Vorhersage genau wie unten gezeigt.
Ich habe mich gefragt, was schief gehen könnte.
Oder, wie kann ich eine genauere Vorhersage bekommen?