Utilizzo di RNN (LSTM) per prevedere i vettori della serie temporale (Theano)


19

Ho un problema molto semplice ma non riesco a trovare lo strumento giusto per risolverlo.

Ho una sequenza di vettori della stessa lunghezza. Ora vorrei addestrare LSTM RNN sul treno campione di queste sequenze e poi farlo predire una nuova sequenza di vettori di lunghezza basata su diversi vettori di priming .n

Non riesco a trovare una semplice implementazione che lo farebbe. Il mio linguaggio di base è Python, ma tutto ciò che non viene installato per giorni conterrà.

Ho provato a usare Lasagne , ma l'implementazione di RNN non è ancora pronta ed è in pacchetti nntools separati . Comunque, ho provato quest'ultimo, ma non riesco a capire come addestrarlo, quindi adescarlo da alcuni vettori di test e lasciare che preveda il / i nuovo / i. I blocchi sono lo stesso problema: non è disponibile alcuna documentazione per LSTM RNN, anche se sembra che ci siano alcune classi e funzioni che potrebbero funzionare (ad es blocks.bricks.recurrent.).

Ci sono diversi attuazione RNN LSTM in Theano, come GroundHog, theano-rnn, theano_lstme il codice per alcune carte, ma non di questi sono tutorial o guida come fare quello che voglio.

L'unica soluzione utilizzabile che ho trovato era l'uso di Pybrain. Ma sfortunatamente manca le funzionalità di Theano (principalmente calcolo della GPU) ed è orfano (nessuna nuova funzionalità e supporto).

Qualcuno sa dove ho potuto trovare quello che sto chiedendo? Facile da lavorare con RNN LSTM per prevedere sequenze di vettori?

Modificare:

Ho provato Keras in questo modo:

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM

model = Sequential()
model.add(Embedding(12, 256))
model.regularizers = []
model(LSTM(256, 128, activation='sigmoid', 
               inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(128, 12))
model.add(Activation('sigmoid'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')

ma ricevo questo errore quando provo ad adattarlo model.fit(X_train, y_train, batch_size=16, nb_epoch=10)

IndexError: index 800 is out of bounds for axis 1 with size 12

mentre X_traine y_trainsono matrici di matrici (di lunghezza 12), ad es[[i for i in range(12)] for j in range(1000)]


1
Perché hai bisogno di RNN se tutte le tue sequenze hanno la stessa lunghezza? Il treno di input statico vettoriale tramite ANN sarebbe più facile e veloce.
itdxer,

I vettori provengono da timeseries. Quindi RNN è necessario immagino?
Kotrfa,

1
RNN è un piacere per le attività quando non si conoscono le dimensioni del vettore di input o output. Ad esempio, vuoi creare una rete che descriva in inglese ciò che puoi vedere nell'immagine, quindi il tuo input può essere un'immagine statica, ma l'output varia in base a ciò che puoi vedere nell'immagine. Un altro esempio quando si desidera ottenere la traduzione del testo, lì input e output sono entrambi sconosciuti.
itdxer,

Grazie per il chiarimento. Quindi non vi è alcun motivo per utilizzare RNN in questa attività. Ok.
Kotrfa,

2
Il commento di @ itdxer è fuorviante. Anche se i tuoi dati hanno la stessa lunghezza ovunque, l'utilizzo di un RNN può essere utile. Un RNN introduce un'ipotesi dei dati, principalmente che è di natura sequenziale. Ad esempio, la traduzione lungo l'asse del tempo è gestita con grazia dagli RNN, ma non dai metodi di feed forward - hanno bisogno di molti più dati di addestramento per rendersene conto e hanno molti più parametri da stimare. Ci sono molti altri casi in cui un ANN si bloccherà e brucerà se usato al posto di un RNN.
Bayerj,

Risposte:


10

Finalmente ho trovato un modo e l' ho documentato sul mio blog qui .

C'è un confronto tra diversi framework e quindi anche un'implementazione in Keras.


5

Suggerirei quanto segue:

0) Theano è davvero potente, ma sì, a volte il merluzzo può essere diffuso per cominciare

1) Ti suggerisco di dare un'occhiata a breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb che è leggermente più facile da comprendere e ha anche un modulo LSTM. Inoltre, una scelta interessante è Autograd di Harvards, che fa la differenziazione simbolica automatica delle funzioni intorpidite https://github.com/HIPS/autograd/blob/master/examples/lstm.py e quindi puoi facilmente capire cosa sta succedendo.

2) Sono un fan di Python ma questa è la mia preferenza personale. Hai mai considerato l'utilizzo di Torch7 il framework più intuitivo per le reti neurali ed è utilizzato anche da Google Deepmind e Facebook AI? Puoi controllare questo post sul blog molto interessante sugli RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Inoltre, un'implementazione LSTM è disponibile nel repository github del post, mentre un'alternativa è il pacchetto rnn https://github.com/Element-Research/rnn .


1
Ho usato con successo il lavoro di Karpathy nelle ultime settimane. Sfortunatamente, non sono in grado di modificare il suo algoritmo per prevedere i vettori e non le sequenze di personaggi. È anche perché non ho molta familiarità con Lua. Quindi, ho usato passivamente anche Torch7, ma non lo trovo molto amichevole. Grazie
kotrfa,

SNN

Ho un vettore di 12 elementi dalla misurazione per ogni secondo. Vorrei allenare la rete, quindi adescarla ad esempio di 5 vettori (di lunghezza 12) e lasciare che preveda il vettore seguente. Niente di più. Ho aggiornato la mia domanda con il mio tentativo di utilizzare Keras.
Kotrfa,

potresti anche usare un semplice feed forward per quello anche se i tuoi vettori provengono da una serie temporale. Assicurati solo che il numero di sequenze sia costante.
Yannis Assael,

Dai pochi articoli che ho letto, come quelli di Karpathy, capisco che l'LSTM è la scelta migliore per le sequenze, no? Il feed forward semplice NN ha la "funzione di memoria"?
Kotrfa,

0

Ho testato LSTM prevedendo una sequenza temporale con Theano. Ho scoperto che per alcune curve morbide, può essere previsto correttamente. Tuttavia per alcune curve a zigzag. È difficile da prevedere. L'articolo dettagliato è il seguente: Prevedere la sequenza temporale con LSTM

Il risultato previsto può essere visualizzato come segue:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.