2017-12-13 8 views
1

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.

enter image description here

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.

enter image description here

Ich habe mich gefragt, was schief gehen könnte.

Oder, wie kann ich eine genauere Vorhersage bekommen?

Antwort

0

Beantworten meiner eigenen Frage. Es ging darum, die Anzahl der Epochen zu erhöhen und an der Losgröße zu feilen. Hier ist zum Beispiel die Vorhersage für #epochs = 200, Stapelgröße = 10.

enter image description here