Utilisation de RNN (LSTM) pour prédire les vecteurs de série temporelle (Theano)

19

J'ai un problème très simple mais je ne trouve pas le bon outil pour le résoudre.

J'ai une séquence de vecteurs de même longueur. Maintenant, je voudrais former LSTM RNN sur un échantillon de train de ces séquences et ensuite le faire pour prédire une nouvelle séquence de vecteurs de longueur basée sur plusieurs vecteurs d' amorçage .n

Je ne trouve pas de mise en œuvre simple qui ferait cela. Ma langue de base est Python, mais tout ce qui ne s'installe pas pendant des jours est valable.

J'ai essayé d'utiliser Lasagne , mais l'implémentation de RNN n'est pas encore prête et elle est dans un paquet séparé nntools . Quoi qu'il en soit, j'ai essayé le dernier mais je ne peux pas comprendre comment l'entraîner, puis l'amorcer avec des vecteurs de test et le laisser prédire le (s) nouveau (s). Les blocs sont le même problème - aucune documentation n'est disponible pour LSTM RNN, bien qu'il semble qu'il existe certaines classes et fonctions qui pourraient fonctionner (par exemple blocks.bricks.recurrent).

Il y a plusieurs de mise en œuvre RNN LSTM dans Théano, comme GroundHog, theano-rnn, theano_lstmet code pour des papiers, mais non de ceux -ci ont tutoriel ou de guide comment faire ce que je veux.

La seule solution utilisable que j'ai trouvée était d'utiliser Pybrain. Mais malheureusement, il manque les fonctionnalités de Theano (principalement le calcul GPU) et est orphelin (pas de nouvelles fonctionnalités et support).

Est-ce que quelqu'un sait où je pourrais trouver ce que je demande? Facile à travailler avec RNN LSTM pour prédire les séquences de vecteurs?

Éditer:

J'ai essayé Keras comme ceci:

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

mais je reçois cette erreur en essayant de l'adapter 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

tandis que X_trainet y_trainsont des tableaux de tableaux (de longueur 12), p.ex.[[i for i in range(12)] for j in range(1000)]

kotrfa
la source
1
Pourquoi avez-vous besoin de RNN si toutes vos séquences ont la même longueur? Former un vecteur d'entrée statique via ANN serait plus facile et plus rapide.
itdxer
Les vecteurs proviennent de la série temporelle. Donc, RNN est nécessaire, je suppose?
kotrfa
1
RNN est idéal pour les tâches lorsque vous ne connaissez pas la taille du vecteur d'entrée ou de sortie. Par exemple, vous voulez créer un réseau qui décrira en anglais ce que vous pouvez voir sur l'image, de sorte que votre entrée puisse être une image statique, mais la sortie variera en fonction de ce que vous pouvez voir sur l'image. Un autre exemple lorsque vous voulez obtenir la traduction de texte, là, votre entrée et votre sortie sont toutes deux inconnues.
itdxer
Merci pour la clarification. Il n'y a donc aucune raison d'utiliser RNN dans cette tâche. D'accord.
kotrfa
2
Le commentaire de @ itdxer est trompeur. Même si vos données ont la même longueur partout, l'utilisation d'un RNN peut être bénéfique. Un RNN introduit une hypothèse des données, principalement qu'elles sont de nature séquentielle. Par exemple, la traduction le long de l'axe du temps est gérée avec élégance par les RNN, mais pas par les méthodes de transmission - ils ont besoin de beaucoup plus de données d'entraînement pour s'en rendre compte et ont beaucoup plus de paramètres à estimer. Il y a beaucoup plus de cas où un ANN va juste planter et brûler s'il est utilisé à la place d'un RNN.
bayerj

Réponses:

10

J'ai finalement trouvé un moyen et je l'ai documenté sur mon blog ici .

Il y a comparaison de plusieurs frameworks et ensuite aussi d'une implémentation dans Keras.

kotrfa
la source
5

Je suggérerais ce qui suit:

0) Theano est vraiment puissant mais oui la morue peut parfois être difficile à démarrer

1) Je vous suggère de consulter breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb qui est légèrement plus facile à comprendre et dispose également d'un module LSTM. En outre, un choix intéressant est autograd par Harvards, qui fait une différenciation symbolique automatique des fonctions numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py et donc vous pouvez facilement comprendre ce qui se passe.

2) Je suis un fan de python mais c'est ma préférence personnelle. Avez-vous envisagé d'utiliser Torch7 est le cadre le plus convivial pour les réseaux de neurones et est également utilisé par Google Deepmind et Facebook AI? Vous pouvez consulter cet article de blog très intéressant sur les RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . De plus, une implémentation LSTM est disponible dans le référentiel github de la publication, tandis qu'une alternative est le package rnn https://github.com/Element-Research/rnn .

Yannis Assael
la source
1
J'ai utilisé avec succès le travail de Karpathy au cours des dernières semaines. Malheureusement, je ne suis pas en mesure de modifier son algorithme pour faire des prédictions de vecteurs et non de séquences de caractères. C'est aussi parce que je ne connais pas très bien Lua. Par conséquent, j'ai également utilisé passivement Torch7, mais je ne le trouve pas vraiment très convivial. Merci
kotrfa
SNN
J'ai un vecteur de 12 éléments de mesure pour chaque seconde. Je voudrais entraîner le filet, puis l'amorcer par exemple avec 5 vecteurs (de longueur 12) et le laisser prédire le vecteur suivant. Rien de plus. J'ai mis à jour ma question en essayant d'utiliser Keras.
kotrfa
vous pouvez également utiliser un flux simple pour cela même si vos vecteurs proviennent d'une série chronologique. Assurez-vous simplement que le nombre de séquences est constant.
Yannis Assael
D'après les quelques articles que j'ai lus, comme celui de Karpathy, je comprends que le LSTM est le meilleur choix pour les séquences, non? Le simple feed-back NN a-t-il la "fonction mémoire"?
kotrfa
0

J'ai testé LSTM prédisant une séquence temporelle avec Theano. J'ai trouvé que pour une courbe lisse, elle peut être prédite correctement. Cependant pour une courbe en zigzag. C'est difficile à prévoir. L'article détaillé est le suivant: Prédire la séquence temporelle avec LSTM

Le résultat prévu peut être affiché comme suit:

érable
la source