2015-09-24 10 views
8

TLDR: Come utilizzare un Keras RNN per prevedere il valore successivo in una sequenza?Previsioni utilizzando una rete neurale ricorrente Keras - la precisione è sempre 1,0


Ho una lista di valori sequenziali. Voglio dar loro da mangiare in un RNN a prevedere il valore successivo nella sequenza.

[ 0.43589744 0.44230769 0.49358974 ..., 0.71153846 0.70833333 0.69230769] 

sto usando Keras per fare questo e posso ottenere una rete con una perdita in diminuzione ma la precisione è costantemente 1.0. Questo è sbagliato. 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 
... 

Ecco la mia rete.

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

Ho provato un SimpleRNN, GRU e LSTM ma non ho avuto fortuna. Ecco come vengono formattati i dati.

# 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) 

Ogni elemento di x_train_10 è un elenco dei precedenti 10 valori. L'ho formattato in questo modo per seguire la documentazione di Keras che i livelli ricorrenti prendono input di forma (nb_samples, timesteps, input_dim).

Ho anche provato a utilizzare uno strato Embedding senza fortuna. (Questo potrebbe essere il modo sbagliato di usarlo - l'ho visto solo usato nella classificazione non nella previsione).

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

pad_sequences anche non ha funzionato.

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

voglio ottenere il RNN lavorare con questo semplice i dati/architettura così posso usarlo per problemi più complessi in seguito.

Grazie :)

risposta

7

ho postato una pagina similar question on the Keras Github e ottenuto una buona risposta.


lukedeo detto che acc: 1.0000 significa che sia la vera uscita e l'uscita prevista sono superiori a 0,5 o viceversa. Invece, dovrei guardare la perdita, o mse, per determinare la precisione del modello. Questo perché la mia rete è una regressione, non un classificatore/clusterer.

Errore quadratico medio quadrato è una buona misura di precisione. accuracy_percent = 1 - np.sqrt(mse)


fchollet (il creatore Keras) elaborato dicendo che "la precisione non è rilevante a tutti per un problema di regressione."

Nell'eseguire un problema di classificazione, accuratezza può essere fatto rilevante modificando class_mode a 'categorical' o 'binary' in model.comple(...) seconda del target (uscita rete).

4

Prova RMSProp come ottimizzatore

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