【发布时间】:2016-06-22 13:10:15
【问题描述】:
我目前有以下代码,用于 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)
目前我有固定数量的时间步长。但是我想将其更改为只有一个时间步,但请记住批次之间的状态。因此,我需要为每一层创建一个状态变量,并将每一层的最终状态分配给它。像这样。
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 层执行此操作。这似乎有点麻烦。我需要跟踪每个保存的状态并在运行中对其进行评估。然后运行需要将状态从我的 GPU 复制到主机内存,这将是低效且不必要的。有更好的方法吗?
【问题讨论】:
-
这是预测时间吗?为什么要每个状态运行一个时间步?需要更多信息才能提供有用的答案。
-
我想我是使用控制依赖项解决的。我想用它来生成一个序列。
-
为了子孙后代,你在做这样的事情吗? with tf.control_dependencies([tf.assign(saved_state, state)]): rnn_outputs[r] = tf.identity(rnn_outputs[r]) ?
-
是的,这就是我正在做的事情
-
你试过
tf.nn.state_saving_rnn()吗?
标签: python tensorflow