Verwendung von RNN (LSTM) zur Vorhersage der Zeitreihenvektoren (Theano)

19

Ich habe ein sehr einfaches Problem, aber ich kann kein passendes Werkzeug finden, um es zu lösen.

Ich habe eine Folge von Vektoren gleicher Länge. Jetzt möchte ich LSTM RNN auf dem Zugmuster dieser Sequenzen trainieren und es dann machen, um eine neue Sequenz von Vektoren der Länge basierend auf mehreren Priming- Vektoren vorherzusagen .n

Ich kann keine einfache Implementierung finden, die dies tun würde. Meine Basissprache ist Python, aber alles, was seit Tagen nicht installiert wird, wird Bestand haben.

Ich habe versucht, Lasagne zu verwenden , aber die Implementierung von RNN ist noch nicht fertig und befindet sich in einem separaten Paket nntools . Wie auch immer, ich habe das letztere ausprobiert, aber ich kann nicht herausfinden, wie es trainiert werden soll. Dann habe ich es mit einigen Testvektoren vorbereitet und lasse es das / die Neue (n) vorhersagen. Blöcke sind das gleiche Problem - für LSTM RNN ist keine Dokumentation verfügbar, obwohl es anscheinend einige Klassen und Funktionen gibt, die funktionieren könnten (z blocks.bricks.recurrent. B. ).

Es gibt mehrere Implementierung von RNN LSTM in Theano, wie GroundHog, theano-rnn, theano_lstmund den Code für einige Papiere, aber nicht von denen haben Tutorial oder führt , wie zu tun , was ich will.

Die einzige brauchbare Lösung, die ich gefunden habe, war die Verwendung von Pybrain. Aber leider fehlen die Funktionen von Theano (hauptsächlich GPU-Berechnung) und sie sind verwaist (keine neuen Funktionen und Unterstützung).

Weiß jemand, wo ich finden könnte, wonach ich bitte? Einfach mit RNN LSTM zu arbeiten, um Sequenzen von Vektoren vorherzusagen?

Bearbeiten:

Ich habe Keras so ausprobiert:

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

aber ich erhalte diesen Fehler, wenn ich versuche, ihn anzupassen 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

while X_trainund y_trainsind Arrays von Arrays (Länge 12), z[[i for i in range(12)] for j in range(1000)]

kotrfa
quelle
1
Warum brauchen Sie RNN, wenn alle Ihre Sequenzen die gleiche Länge haben? Das Trainieren des statischen Eingabevektors über ANN wäre einfacher und schneller.
Itdxer
Die Vektoren stammen aus Zeitreihen. Also ist RNN notwendig, denke ich?
kotrfa
1
RNN ist ideal für Aufgaben, bei denen die Größe von Eingabe- oder Ausgabevektoren nicht bekannt ist. Zum Beispiel möchten Sie ein Netzwerk aufbauen, das auf Englisch beschreibt, was auf dem Bild zu sehen ist, damit Ihre Eingabe ein statisches Bild sein kann, aber die Ausgabe hängt davon ab, was auf dem Bild zu sehen ist. Ein weiteres Beispiel, wenn Sie eine Textübersetzung wünschen, sind Ihre Eingaben und Ausgaben beide unbekannt.
Itdxer
Vielen Dank für die Klarstellung. Es gibt also keinen Grund, RNN für diese Aufgabe zu verwenden. Okay.
Kotrfa
2
@ itdxers Kommentar ist irreführend. Auch wenn Ihre Daten überall die gleiche Länge haben, kann die Verwendung eines RNN von Vorteil sein. Ein RNN führt eine Annahme der Daten ein, hauptsächlich, dass sie sequentieller Natur sind. ZB wird die Übersetzung entlang der Zeitachse von RNNs mit Sorgfalt behandelt, nicht jedoch von Feed-Forward-Methoden - sie benötigen viel mehr Trainingsdaten, um dies zu realisieren, und sie müssen viel mehr Parameter schätzen. Es gibt viele weitere Fälle, in denen ein ANN nur abstürzt und brennt, wenn er anstelle eines RNN verwendet wird.
Bayerj

Antworten:

10

Ich habe endlich einen Weg gefunden und ihn hier in meinem Blog dokumentiert .

Es werden mehrere Frameworks verglichen und dann auch eine Implementierung in Keras.

kotrfa
quelle
5

Ich würde folgendes vorschlagen:

0) Theano ist wirklich mächtig, aber ja, der Kabeljau kann manchmal schwierig sein

1) Ich empfehle Ihnen, breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb auszuprobieren, was etwas einfacher ist zu verstehen und hat auch ein LSTM-Modul. Darüber hinaus bietet Harvards eine interessante Möglichkeit, die Numpy-Funktionen automatisch symbolisch zu unterscheiden: https://github.com/HIPS/autograd/blob/master/examples/lstm.py. Sie können also leicht nachvollziehen, was vor sich geht.

2) Ich bin ein Python-Fan, aber das ist meine persönliche Vorliebe. Haben Sie in Betracht gezogen, dass Torch7 das benutzerfreundlichste Framework für neuronale Netzwerke ist und auch von Google Deepmind und Facebook AI verwendet wird? Sie können diesen sehr interessanten Blog-Beitrag über RNNs unter http://karpathy.github.io/2015/05/21/rnn-effectiveness/ nachlesen . Zusätzlich ist eine LSTM-Implementierung im Github-Repo des Posts verfügbar, während eine Alternative das RNN-Paket https://github.com/Element-Research/rnn ist .

Yannis Assael
quelle
1
Ich habe Karpathys Arbeit in den letzten Wochen erfolgreich eingesetzt. Leider kann ich seinen Algorithmus nicht optimieren, um Vektoren und nicht Zeichenfolgen vorherzusagen. Es liegt auch daran, dass ich mit Lua nicht sehr vertraut bin. Daher habe ich auch passiv Torch7 verwendet, aber ich finde es nicht wirklich sehr freundlich. Vielen Dank
kotrfa
SNN
Ich habe einen Vektor von 12 Elementen aus der Messung für jede Sekunde. Ich möchte das Netz trainieren, dann z. B. mit 5 Vektoren (Länge 12) grundieren und den folgenden Vektor vorhersagen lassen. Nichts mehr. Ich habe meine Frage mit meinem Versuch, Keras zu verwenden, aktualisiert.
Kotrfa
Sie können dafür auch einen einfachen Feed-Forward verwenden, selbst wenn Ihre Vektoren aus einer Zeitreihe stammen. Stellen Sie einfach sicher, dass die Anzahl der Sequenzen konstant ist.
Yannis Assael
Aus den wenigen Artikeln, die ich wie die von Karpathy's gelesen habe, geht hervor, dass das LSTM die beste Wahl für Sequenzen ist, nicht wahr? Hat einfache Vorwärtskopplung NN die "Speicherfunktion"?
Kotrfa
0

Ich habe LSTM getestet und mit Theano eine bestimmte Zeitsequenz vorhergesagt. Ich fand, dass für einige glatte Kurven es richtig vorhergesagt werden kann. Allerdings für einige Zick-Zack-Kurve. Es ist schwer vorherzusagen. Der detaillierte Artikel lautet wie folgt : Vorhersage der Zeitsequenz mit LSTM

Das vorhergesagte Ergebnis kann wie folgt angezeigt werden:

Ahorn
quelle