我目前正在尝试构建一个用于预测时间序列的简单模型 . 目标是使用序列训练模型,以便模型能够预测未来值 .
我正在使用tensorflow和lstm单元格来执行此操作 . 该模型通过时间截断反向传播进行训练 . 我的问题是如何构建培训数据 .
例如,假设我们想要学习给定的序列:
[1,2,3,4,5,6,7,8,9,10,11,...]
我们将网络展开 num_steps=4
.
Option 1
input data label
1,2,3,4 2,3,4,5
5,6,7,8 6,7,8,9
9,10,11,12 10,11,12,13
...
Option 2
input data label
1,2,3,4 2,3,4,5
2,3,4,5 3,4,5,6
3,4,5,6 4,5,6,7
...
Option 3
input data label
1,2,3,4 5
2,3,4,5 6
3,4,5,6 7
...
Option 4
input data label
1,2,3,4 5
5,6,7,8 9
9,10,11,12 13
...
任何帮助,将不胜感激 .
3 回答
我正准备在TensorFlow中学习LSTM并尝试实现一个例子(幸运的是)试图预测一些由简单数学函数处理的时间序列/数字系列 .
但是我正在使用一种不同的方式来构建训练数据,这是由Unsupervised Learning of Video Representations using LSTMs推动的:
LSTM Future Predictor Model
Option 5:
除了本文之外,我(尝试)通过给定的TensorFlow RNN示例获取灵感 . 我目前的完整解决方案如下所示:
此示例输出如下所示:
该模型是LSTM自动编码器,每个都有2层 .
不幸的是,正如您在结果中看到的那样,此模型无法正确学习序列 . 我可能就是这样,我只是在某个地方犯了一个错误的错误,或者1000-10000的训练步骤对于LSTM来说只是少数几个 . 正如我所说,我也刚刚开始理解/正确使用LSTM . 但希望这可以为您提供有关实施的一些启发 .
阅读了几篇LSTM介绍博客,例如Jakob Aungiers',选项3似乎是无状态LSTM的正确选项 .
如果您的LSTM需要比
num_steps
更久以前记住数据,那么您可以以有状态的方式训练 - 对于Keras示例,请参阅Philippe Remy's blog post "Stateful LSTM in Keras" . 但是,Philippe没有显示批量大于1的示例 . 我想在您的情况下,具有状态LSTM的批量大小为4可以与以下数据一起使用(写为input -> label
):由此,例如,批次#0中的第二个样本被正确地重复使用以继续使用批次#1的第二个样本进行训练 .
这与您的选项4类似,但是您没有使用所有可用的标签 .
Update:
在我的建议的延伸
batch_size
等于num_steps
,Alexis Huet gives an answer为batch_size
的情况是num_steps
的除数,可以用于更大的num_steps
. 他describes it nicely在他的博客上 .我认为选项1最接近/tensorflow/models/rnn/ptb/reader.py中的参考实现
但是,另一个选项是为每个训练序列随机选择指向数据数组的指针 .