相关疑难解决方法(0)

TensorFlow:记住下一批次的LSTM状态(有状态LSTM)

给定训练有素的LSTM模型,我想对单个时间步进行推理,即seq_length = 1在下面的示例中.在每个时间步之后,需要记住内部LSTM(内存和隐藏)状态以用于下一个"批处理".在推理的最开始,init_c, init_h给定输入计算内部LSTM状态.然后将它们存储在LSTMStateTuple传递给LSTM 的对象中.在训练期间,每个时间步都更新此状态.然而,对于推理,我希望state在批次之间保存,即初始状态只需要在开始时计算,然后在每个"批次"(n = 1)之后保存LSTM状态.

我发现这个相关的StackOverflow问题:Tensorflow,在RNN中保存状态的最佳方法?.但是,这仅在以下情况下有效state_is_tuple=False,但TensorFlow很快就会弃用此行为(请参阅rnn_cell.py).Keras似乎有一个很好的包装器可以使有状态的 LSTM成为可能,但我不知道在TensorFlow中实现这一目标的最佳方法.TensorFlow GitHub上的这个问题也与我的问题有关:https://github.com/tensorflow/tensorflow/issues/2838

有关构建有状态LSTM模型的任何好建议吗?

inputs  = tf.placeholder(tf.float32, shape=[None, seq_length, 84, 84], name="inputs")
targets = tf.placeholder(tf.float32, shape=[None, seq_length], name="targets")

num_lstm_layers = 2

with tf.variable_scope("LSTM") as scope:

    lstm_cell  = tf.nn.rnn_cell.LSTMCell(512, initializer=initializer, state_is_tuple=True)
    self.lstm  = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_lstm_layers, state_is_tuple=True)

    init_c = # compute initial LSTM memory state using contents in placeholder 'inputs'
    init_h = # compute initial LSTM …
Run Code Online (Sandbox Code Playgroud)

python stateful lstm tensorflow recurrent-neural-network

23
推荐指数
2
解决办法
1万
查看次数

Tensorflow,在RNN中保存状态的最佳方法?

我目前在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)
Run Code Online (Sandbox Code Playgroud)

目前我有固定的时间步数.但是我想把它改成只有一个时间步,但要记住批次之间的状态.因此,我需要为每个图层创建一个状态变量,并为每个图层指定最终状态.像这样的东西.

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)
Run Code Online (Sandbox Code Playgroud)

然后,对于每个层,我需要在sess.run函数中评估已保存的状态以及调用我的训练函数.我需要为每个rnn层执行此操作.这看起来很麻烦.我需要跟踪每个保存的状态并在运行中对其进行评估.此外,运行将需要将状态从我的GPU复制到主机内存,这将是低效且不必要的.有没有更好的方法呢?

python tensorflow

14
推荐指数
1
解决办法
5711
查看次数