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.