我在固定大小的段上运行RNN。以下代码允许我保留上一批的最终状态以初始化下一批的初始状态。
rnn_outputs, final_state = tf.contrib.rnn.static_rnn(cell, rnn_inputs, initial_state=init_state)
当批次不重叠时,这种方法有效。例如,我的第一批处理样本0:124,final_state
是此处理后的状态。然后,下一批处理样本124:256,将init_state
设置为final_state
。
我的问题是如何在批次重叠时检索中间状态。首先,我处理样本0:124,然后是10:134,20:144,所以跳跃大小是10.我想要检索不是final_state
而是处理10个样本后的状态。
TF有可能保持中间状态吗? documentation表示返回值仅包含最终状态。
图像显示由于状态不连续而面临的问题。在我的程序中,RNN段长度为215,跳跃长度为20。
更新:最简单的是David Parks描述的内容:
rnn_outputs_one, mid_state = tf.contrib.rnn.static_rnn(cell, rnn_inputs_one, initial_state=rnn_tuple_state)
rnn_outputs_two, final_state = tf.contrib.rnn.static_rnn(cell, rnn_inputs_two, initial_state=mid_state)
rnn_outputs = rnn_outputs_one + rnn_outputs_two
和
prev_state = sess.run(mid_state)
答案 0 :(得分:1)
在tensorflow中,从调用sess.run
返回后保留的唯一内容是变量。您应该为状态创建变量,然后使用tf.assign
将RNN单元格的结果分配给该变量。然后,您可以像使用任何其他张量一样使用该变量。
如果您需要将变量初始化为0
以外的其他内容,则可以使用占位符调用sess.run
一次,并专门设置tf.assign
来设置变量。
添加了详细信息:
如果你需要一个中间状态,让我们说你跑了0:124的时间步,你想要步骤10,你应该把它分成2个RNN单元,一个处理前10个时间步,第二个继续处理接下来的114个步骤。只要在static_rnn
函数中使用相同的单元格(LSTM或其他单元格),这就不会影响训练和反向传播。单元格是定义权重的位置,必须保持不变。您的渐变将向后流过第二个单元格,然后最终适当地流向第一个单元格。
答案 1 :(得分:0)
所以,我早些时候来这里寻找答案,但我最终创造了一个答案。
类似于上面关于使其可分配的海报......
构建图表时,请列出序列占位符,例如..
my_states = [None] * int(sequence_length + 1)
my_states[0] = cell.zero_state()
for step in steps:
cell_out, my_states[step+1] = cell( )
然后在sess.run()之后的图表之外你说
new_states = my_states[1:]
model.my_states = new_states
这种情况是一次步进1个步骤,但可以很容易地进行10步。只需在sess.run()之后切片状态列表并使它们成为初始状态。
祝你好运!