使用RNN(LSTM)预测时间序列向量(Theano)


19

我有一个非常简单的问题,但找不到合适的工具来解决。

我有一些长度相同的向量序列。现在,我想在这些序列的训练样本上训练LSTM RNN,然后使其基于几个启动向量来预测长度为的向量的新序列。ñ

我找不到能做到这一点的简单实现。我的基本语言是Python,但是任何几天都不会安装的东西都可以使用。

我尝试使用Lasagne,但是RNN的实现尚未准备好,并且在nntools单独的软件包中。无论如何,我尝试了后者,但是我不知道如何训练它,然后通过一些测试向量对其进行填充,并让它预测新的。块是同样的问题-尽管似乎有些类和函数可以工作(例如blocks.bricks.recurrent),但是LSTM RNN没有可用的文档。

有在Theano,像几个实施RNN LSTM的GroundHogtheano-rnntheano_lstm和一些文件的代码,但非那些与教程或指导怎么做我想做的。

我发现的唯一可用解决方案是使用Pybrain。但是不幸的是,它缺少Theano的功能(主要是GPU计算),并且是孤立的(没有新功能和支持)。

有谁知道我在哪里可以找到我想要的东西?使用RNN LSTM易于预测载体序列吗?

编辑:

我像这样尝试了Keras:

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

但是我在尝试适应它时遇到此错误 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_trainy_train是数组的数组(长度为12),例如[[i for i in range(12)] for j in range(1000)]


1
如果所有序列的长度都相同,为什么需要RNN?通过ANN训练静态输入向量将更容易,更快。
itdxer 2015年

向量来自时间序列。所以我猜需要RNN吗?
kotrfa 2015年

1
当您不知道输入或输出向量大小时,RNN非常适合执行任务。例如,您要构建一个网络,该网络将用英语描述您在图片上看到的内容,因此您的输入可以是静态图片,但是输出将取决于您在图片上看到的内容而有所不同。另一个示例,当您要进行文本翻译时,您的输入和输出都是未知的。
itdxer 2015年

谢谢您的澄清。因此,没有理由在此任务中使用RNN。好。
kotrfa 2015年

2
@itdxer的评论具有误导性。即使您的数据在任何地方都具有相同的长度,使用RNN也会有好处。RNN引入了一个数据假设,主要是它具有顺序性质。例如,沿时间轴的平移由RNN很好地处理,而不是由前馈方法处理-它们需要更多的训练数据来实现,并且需要更多的参数来估计。在许多情况下,如果使用ANN代替RNN,ANN只会崩溃并烧毁。
2015年

Answers:



5

我建议以下几点:

0)Theano真的很强大,但是是的,有时候鳕鱼可能很难消化

1)我建议您检查一下Breze:https : //github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb稍微容易些可以理解,并具有LSTM模块。此外,哈佛大学的autograd是一个引人入胜的选择,它可以自动对numpy函数进行符号区分,例如https://github.com/HIPS/autograd/blob/master/examples/lstm.py,因此您可以轻松地了解发生了什么。

2)我是Python迷,但这是我个人的偏爱。您是否考虑过使用Torch7是神经网络中最用户友好的框架,并且Google Deepmind和Facebook AI也使用过Torch7?您可以在http://karpathy.github.io/2015/05/21/rnn-effectiveness/中查看有关RNN的非常有趣的博客文章。此外,该帖子的github存储库中提供了LSTM实现,而替代方法是rnn包https://github.com/Element-Research/rnn


1
最近几周,我已经成功地使用了Karpathy的作品。不幸的是,我无法调整他的算法来预测矢量而不是字符序列。这也是因为我对Lua不太熟悉。因此,我也被动使用过Torch7,但我并不觉得它非常友好。谢谢
kotrfa 2015年

小号ññ

我每秒测量12个元素的向量。我想训练网络,然后用5个向量(长度为12)对它进行底涂,然后预测下面的向量。而已。我已经尝试使用Keras更新了问题。
kotrfa 2015年

即使向量来自时间序列,也可以使用简单的前馈。只需确保序列数恒定即可。
Yannis Assael,2015年

从我读过的几篇文章(如Karpathy的文章)中,我了解到LSTM是序列的最佳选择,不是吗?简单前馈NN是否具有“内存功能”?
kotrfa 2015年

0

我已经测试了LSTM与Theano一起预测的时间序列。我发现对于某些平滑曲线,可以正确预测。但是对于某些之字形曲线。很难预测。详细的文章如下: 用LSTM预测时间顺序

预测结果如下:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.