2015-09-24 5 views
8

TLDR: Wie verwende ich eine Keras RNN, um den nächsten Wert in einer Sequenz vorherzusagen?Vorhersagen mit einem Keras Rekurrenten Neuronalen Netzwerk - Genauigkeit ist immer 1.0


Ich habe eine Liste von sequentiellen Werten. Ich möchte sie in einen RNN zu voraussagen den nächsten Wert in der Sequenz.

Ich benutze Keras, um dies zu tun und kann ein Netzwerk mit einem abnehmenden Verlust bekommen, aber die Genauigkeit ist konsequent 1,0. Das ist falsch. y_tests != model.predict(x_tests).

Epoch 0 
1517/1517 [==============================] - 0s - loss: 0.0726 - acc: 1.0000 - val_loss: 0.0636 - val_acc: 1.0000 
Epoch 1 
1517/1517 [==============================] - 0s - loss: 0.0720 - acc: 1.0000 - val_loss: 0.0629 - val_acc: 1.0000 
... 

Hier ist mein Netzwerk.

model = Sequential() 
model.add(SimpleRNN(1, 100)) 
model.add(Dense(100, 1, activation = "sigmoid")) 
model.compile(loss="mean_squared_error", optimizer = "sgd") 

Ich habe eine SimpleRNN, GRU und LSTM versucht, aber haben kein Glück gehabt. Hier ist, wie die Daten formatiert sind.

# Current value 
y_train = [[ 0.60576923] [ 0.64102564] [ 0.66025641] ..., [ 0.71153846] [ 0.70833333] [ 0.69230769]] 

# Previous 10 values 
x_train_10 = [ 
    [[ 0.65064103] [ 0.66346154] [ 0.66346154] ..., [ 0.72115385] [ 0.72435897] [ 0.71153846]] ..., 
    [[ 0.66346154] [ 0.66346154] [ 0.67628205] ..., [ 0.72435897] [ 0.71153846] [ 0.70833333]] 
] 

# Previous value 
x_train_1 = [[ 0.58333333] [ 0.60576923] [ 0.64102564] ..., [ 0.72435897] [ 0.71153846] [ 0.70833333]] 

# So here are the shapes... 
y_train.shape = (1895, 1) 
x_train_10.shape = (1895, 10, 1) 
x_train_1.shape = (1895, 1) 

Jedes Element in x_train_10 ist eine Liste der letzten 10 Werten. Ich formatierte es so, um Keras 'Dokumentation zu folgen, dass wiederkehrende Schichten Eingaben von Form (nb_samples, timesteps, input_dim) annehmen.

Ich habe auch versucht, eine Schicht ohne Glück zu verwenden. (Dies kann der falsche Weg sein, es zu benutzen - ich habe es nur in der Klassifizierung nicht Vorhersage gesehen).

model = Sequential() 
model.add(Embedding(1, 30)) 
model.add(LSTM(30, 100)) 
... 

pad_sequences hat auch nicht funktioniert.

x_train_1 = sequence.pad_sequences(x_train_1, maxlen = None, dtype = "float32") 

Ich möchte die RNN bekommen mit dieser einfachen Daten/Architektur arbeiten, damit ich es für komplexere Probleme später verwenden können.

Thanks :)

Antwort

7

Ich schrieb eine similar question on the Keras Github Seite und bekam eine gute Antwort.


lukedeo gesagt, dass acc: 1.0000 bedeutet, dass sowohl der wahre Ausgang und die vorhergesagte Ausgabe größer als 0,5 oder umgekehrt. Stattdessen sollte ich den Verlust oder mse betrachten, um die Genauigkeit des Modells zu bestimmen. Dies liegt daran, dass mein Netzwerk eine Regression ist, kein Klassifizierer/Clusterer.

Der mittlere quadratische Fehler ist ein gutes Maß für die Genauigkeit. accuracy_percent = 1 - np.sqrt(mse)


fchollet (das Keras Konzept) erarbeitet, indem er sagt, dass "Genauigkeit nicht relevant ist überhaupt für ein Regressionsproblem."

Wenn ein Klassifikationsproblem dabei, die Genauigkeit kann durch Einstellung class_mode zu 'categorical' oder 'binary'model.comple(...) in Abhängigkeit von dem Ziel (Netzausgang) relevant gemacht werden.

4

Versuchen RMSProp als optimiser

model.compile(loss="mean_squared_error", optimizer = 'rmsprop') 
Verwandte Themen