Tengo un problema muy simple pero no puedo encontrar una herramienta adecuada para resolverlo.
Tengo una secuencia de vectores de la misma longitud. Ahora me gustaría entrenar LSTM RNN en la muestra de tren de estas secuencias y luego hacer que prediga una nueva secuencia de vectores de longitud función de varios vectores de cebado .
No puedo encontrar una implementación simple que haga esto. Mi lenguaje base es Python, pero cualquier cosa que no se instale durante días se mantendrá.
Intenté usar Lasagne , pero la implementación de RNN aún no está lista y está en paquetes separados de herramientas . De todos modos, probé el último pero no puedo entender cómo entrenarlo, luego lo preparé con algunos vectores de prueba y dejé que prediga los nuevos. Los bloques son el mismo problema: no hay documentación disponible para LSTM RNN, aunque parece que hay algunas clases y funciones que podrían funcionar (por ejemplo blocks.bricks.recurrent
).
Hay varios implementación de RNN LSTM en Teano, como GroundHog
, theano-rnn
, theano_lstm
y el código para algunos papeles, pero no de ellos han tutorial o guía de cómo hacer lo que quiero.
La única solución utilizable que encontré fue usar Pybrain. Pero desafortunadamente carece de las características de Theano (principalmente el cálculo de GPU) y está huérfano (no hay nuevas características y soporte).
¿Alguien sabe dónde puedo encontrar lo que estoy pidiendo? ¿Fácil de trabajar con RNN LSTM para predecir secuencias de vectores?
Editar:
Intenté Keras así:
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')
pero recibo este error cuando intento ajustarlo 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_train
y y_train
son matrices de matrices (de longitud 12), p. ej.[[i for i in range(12)] for j in range(1000)]
fuente
Respuestas:
Finalmente encontré un camino y lo documenté en mi blog aquí .
Hay una comparación de varios marcos y luego también una implementación en Keras.
fuente
Sugeriría lo siguiente:
0) Theano es realmente poderoso, pero sí, el bacalao puede ser difícil a veces para empezar
1) Te sugiero que eches un vistazo a breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, que es un poco más fácil para ser entendido y tiene un módulo LSTM también. Además, una opción interesante es autograd by Harvards, que hace una diferenciación simbólica automática de funciones numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py y, por lo tanto, puede comprender fácilmente lo que está sucediendo.
2) Soy fanático de Python, pero esta es mi preferencia personal. ¿Has considerado usar Torch7 es el marco más fácil de usar para redes neuronales y también lo usan Google Deepmind y Facebook AI? Puede consultar esta publicación de blog muy interesante sobre RNNs http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Además, una implementación de LSTM está disponible en el repositorio de github de la publicación, mientras que una alternativa es el paquete rnn https://github.com/Element-Research/rnn .
fuente
He probado LSTM prediciendo alguna secuencia de tiempo con Theano. Descubrí que para una curva suave, se puede predecir correctamente. Sin embargo para alguna curva en zigzag. Es difícil de predecir. El artículo detallado es el siguiente: Predecir secuencia de tiempo con LSTM
El resultado previsto se puede mostrar de la siguiente manera:
fuente