Tensorflow-批处理中的LSTM状态重用
我正在研究Tensorflow NN,它使用LSTM跟踪参数(时间序列数据回归问题)。一批训练数据包含一批大小的连续观测值。我想使用LSTM状态作为下一个示例的输入。因此,如果我有一批数据观测值,我想将第一个观测值的状态作为第二个观测值的输入,以此类推。下面我将lstm状态定义为大小=批次大小的张量。我想在批处理中重用状态:Tensorflow-批处理中的LSTM状态重用,tensorflow,lstm,recurrent-neural-network,Tensorflow,Lstm,Recurrent Neural Network,我正在研究Tensorflow NN,它使用LSTM跟踪参数(时间序列数据回归问题)。一批训练数据包含一批大小的连续观测值。我想使用LSTM状态作为下一个示例的输入。因此,如果我有一批数据观测值,我想将第一个观测值的状态作为第二个观测值的输入,以此类推。下面我将lstm状态定义为大小=批次大小的张量。我想在批处理中重用状态: 在API中有一个tf.nn.state\u saving\n,但是文档有点模糊我的问题:如何在训练批中重用当前状态。基本上就是这样,只需使用当前状态更新状态: state_
在API中有一个tf.nn.state\u saving\n,但是文档有点模糊我的问题:如何在训练批中重用当前状态。基本上就是这样,只需使用
当前状态
更新状态
:
state_update = tf.assign(state, curr_state)
然后,确保调用state\u update
本身上的run
,或者将state\u update
作为依赖项的操作,否则分配不会实际发生。例如:
with tf.control_dependencies([state_update]):
model_output = ...
正如注释中所建议的,RNN的典型情况是,您有一个批次,其中第一个维度(0)是序列的数量,第二个维度(1)是每个序列的最大长度(如果您在构建RNN时通过
time\u major=True
,这两个维度将被交换)。理想情况下,为了获得良好的性能,您可以将多个序列堆叠到一个批中,然后按时间分割该批。但这实际上是一个不同的主题。为了澄清,您想将第一个批处理元素的结果的状态线程化到下一个批处理元素的开始状态,依此类推?在这种情况下,批处理维度不正是时间维度吗?@Allen Lavoie,是的,这是正确的。批处理中的每个数据观察都是一个(多维)时间序列窗口。该批包含按顺序排列的重叠窗口。批处理维度是一个时间维度,有重叠和跨步。在这种情况下,批处理维度实际上是1。除非您有多个序列可以一起批处理,否则这将是相对缓慢的。目前正在努力支持允许对单个较长时间序列进行批处理的近似方法,但尚未公开发布任何内容。感谢您的解释!如果你能再解释一下“针对单个较长时间序列的批处理”是如何工作的,并写出一个答案,我就做标记。
with tf.control_dependencies([state_update]):
model_output = ...