我现在有下面的代码用于tensorflow中一系列链接在一起的rnn。我没有使用MultiRNN,因为我稍后要对每个层的输出做一些事情。
for r in range(RNNS):
with tf.variable_scope('recurent_%d' % r) as scope:
state = [tf.zeros((BATCH_SIZE, sz)) for sz in rnn_func.state_size]
time_outputs = [None] * TIME_STEPS
for t in range(TIME_STEPS):
rnn_input = getTimeStep(rnn_outputs[r - 1], t)
time_outputs[t], state = rnn_func(rnn_input, state)
time_outputs[t] = tf.reshape(time_outputs[t], (-1, 1, RNN_SIZE))
scope.reuse_variables()
rnn_outputs[r] = tf.concat(1, time_outputs)
目前我有固定的时间步数。不过,我希望将其更改为只有一个timestep,但记住批处理之间的状态。因此,我需要为每个层创建一个状态变量,并为其分配每个层的最终状态。像这样的东西。
for r in range(RNNS):
with tf.variable_scope('recurent_%d' % r) as scope:
saved_state = tf.get_variable('saved_state', ...)
rnn_outputs[r], state = rnn_func(rnn_outputs[r - 1], saved_state)
saved_state = tf.assign(saved_state, state)
然后,对于每个层,我需要评估sess.run函数中保存的状态,并调用我的训练函数。我需要对每个rnn层都这样做。这看起来有点麻烦。我需要跟踪每个保存的状态并在运行时对其进行评估。另外,run需要将状态从我的GPU复制到主机内存,这将是低效和不必要的。有更好的办法吗?
我现在使用tf.control_依赖项保存RNN状态。这是一个例子。
我只是确保我的图形的一部分依赖于保存状态。
这两个链接对于这个问题也是相关和有用的:
https://github.com/tensorflow/tensorflow/issues/2695https://github.com/tensorflow/tensorflow/issues/2838
下面是通过定义状态变量来更新LSTM初始状态的代码。它还支持多个层。
我们定义了两个函数-一个用于获取初始状态为零的状态变量,另一个用于返回操作,我们可以传递给
session.run
,以便用LSTM的最后一个隐藏状态更新状态变量。我们可以使用它在每个批处理之后更新LSTM的状态。请注意,我使用
tf.nn.dynamic_rnn
展开:与this answer的主要区别在于
state_is_tuple=True
使LSTM的状态成为包含两个变量(单元状态和隐藏状态)的LSTMStateTuple,而不仅仅是一个变量。然后使用多个层使LSTM的状态成为LSTMStateTuples的元组-每层一个。重置为零
使用经过训练的模型进行预测/解码时,可能需要将状态重置为零。然后,您可以使用此功能:
例如,如上所述:
相关问题 更多 >
编程相关推荐