Jul*_*man 9 python python-3.x autoencoder lstm tensorflow
的形状p_input在此LSTM自动编码为"test.py"是(128,8,1); 意思是128组8位数.我试图使用4组25,000个时间步长(基本上0秒到25,000秒)使这个模型适应基于时间序列的数据.我尝试将此数据集输入到p_input形状(4,25000,1)中,并且没有发生错误.但是当我运行脚本时,而不是让iter 1: 0.01727, iter 2: 0.00983, ...我没有得到脚本的任何打印反馈,所以我假设有一些东西正在举行脚本.我还尝试将未更改batch_num为4和step_num25,000直接更改为未编辑的"test.py"文件,并且没有发生打印反馈的相同结果.
我的想法是,在"test.py"中,p_inputs计算tf.split和tf.squeeze操作的时间太长.另一个想法是我可能需要增加隐藏的LSTM单元hidden_num的数量和/或增加epochs(iteration)的数量.此外,它可能batch_num必须大于step_num.我试图与"test.py"同step_num = 4和batch_num = 25000和脚本印反馈正常运行.
让我知道你对阻止脚本运行的问题的看法.
输入的第二个维度是网络展开以通过BPTT算法计算梯度的次数。
这个想法是通过将每个时间步“展开”为网络的新层,将循环网络(如 LSTM)转换为前馈网络。
当您一起提供整个时间序列(即 25000 个时间步长)时,您将展开网络 25000 次,也就是说,您将获得具有 25000 层的展开前馈网络!
因此,尽管我不知道为什么您没有收到任何错误,但问题可能与内存不足问题有关。您无法将 25000 个图层的变量放入内存中。
当您必须处理长时间序列时,您需要将数据拆分为块(假设有 20 个时间步长)。每次运行您提供一个块。然后,在接下来的每次运行中,您需要将网络的初始状态恢复为上次运行的最后状态。
我可以给你举个例子。你现在拥有的(出于实际原因我忽略了第三维)是一个 4x25000 的向量,其形状如下:
--------------------- 25000----------------------
|
|
4
|
|
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
您现在必须将其分成如下所示的块:
----20----- ----20----- ----20-----
| | | | | |
| | | | | |
4 | 4 | 4 | [...]
| | | | | |
| | | | | |
----------- ----------- -----------
Run Code Online (Sandbox Code Playgroud)
您每次提供 4x20 的单个块。然后,每次卡盘之后 LSTM 的最终状态必须作为下一个卡盘的输入提供。
所以你的feed_dict必须是这样的:
feed_dict ={x: input_4_20},
state.c = previous_state.c,
state.h=previous_state.h}
Run Code Online (Sandbox Code Playgroud)
有关如何为下一次运行提供 LSTM 状态的示例,请参阅Tensorflow 的LM 教程。
Tensorflow 提供了一些函数来自动执行此操作。查看RNN API 上的Tensorflow DevSummit 教程了解更多信息。我链接了解释所需功能的确切第二个。该函数是tf.contrib.training.batch_sequences_with_states(...)
作为最后的建议,我建议您重新考虑您的任务。事实上,25000 个时间序列是一个非常长的序列,我担心即使是 LSTM 也无法管理这么长时间的依赖关系。我的意思是,当您处理该系列的第 24000 个元素时,LSTM 状态可能已经忘记了有关第一个元素的所有内容。在这些情况下,请尝试查看您的数据以了解您的现象的规模。如果您不需要一秒的粒度(即您的系列是高度冗余的,因为功能不会及时快速变化),请缩小系列的规模以管理更短的序列。
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |