1

Betrachten Sie dieses minimal runnable Beispiel:

from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 
import numpy as np 
import matplotlib.pyplot as plt 


max = 30 
step = 0.5 
n_steps = int(30/0.5) 

x = np.arange(0,max,step) 
x = np.cos(x)*(max-x)/max 

y = np.roll(x,-1) 
y[-1] = x[-1] 

shape = (n_steps,1,1) 
batch_shape = (1,1,1) 

x = x.reshape(shape) 
y = y.reshape(shape) 

model = Sequential() 
model.add(LSTM(50, return_sequences=True, stateful=True, batch_input_shape=batch_shape)) 
model.add(LSTM(50, return_sequences=True, stateful=True)) 

model.add(Dense(1)) 

model.compile(loss='mse', optimizer='rmsprop') 

for i in range(1000): 
    model.reset_states() 
    model.fit(x,y,nb_epoch=1, batch_size=1) 
    p = model.predict(x, batch_size=1) 
    plt.clf() 
    plt.axis([-1,31, -1.1, 1.1]) 
    plt.plot(x[:, 0, 0], '*') 
    plt.plot(y[:,0,0],'o') 
    plt.plot(p[:,0,0],'.') 
    plt.draw() 
    plt.pause(0.001) 

Wie in der keras API angegeben https://keras.io/layers/recurrent/Zug Keras Stateful LSTM return_seq = Lernen gilt nicht

den letzten Zustand für jeden an dem Index Probe i in einer Charge wird als Anfangszustand für die Probe von Index i in der folgenden Charge verwendet

Also verwende ich batch_size = 1 und ich versuche, den nächsten Wert in der abfallenden Cos-Funktion für jeden Zeitschritt vorherzusagen. Die Vorhersage oder die roten Punkte im Bild unten sollten in die grünen Kreise gehen, damit das Skript es richtig vorhersagt, aber es konvergiert nicht ... Haben Sie eine Idee, um es zu lernen?

1

+0

Versuchen Sie auch vor der Vorhersage "reset_states". –

+0

Immer noch nicht konvergierend :( – user1506145

+0

Also versuchen Sie 'mae' von' mse' –

Antwort

2

Das Problem log in ein separat model.fit für jede Epoche aufrufen. In diesem Fall werden optimizer Parameter zurückgesetzt, was für einen Trainingsprozess schädlich war. Andere Sache ruft reset_states auch vor der Vorhersage - als ob es nicht aufgerufen wurde - die states von fit sind Startzustände für die Vorhersage, was auch schädlich sein könnte. Der endgültige Code lautet wie folgt:

for epoch in range(1000): 
    model.reset_states() 
    tot_loss = 0 
    for batch in range(n_steps): 
     batch_loss = model.train_on_batch(x[batch:batch+1], y[batch:batch+1]) 
     tot_loss+=batch_loss 

    print "Loss: " + str(tot_loss/float(n_steps)) 
    model.reset_states() 
    p = model.predict(x, batch_size=1)