相关疑难解决方法(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
查看次数

dynamic_rnn中的swap_memory允许准无限序列?

我试图用长字符序列标记字母.数据的固有结构要求我使用双向方法.

此外,基于这个想法,我需要在每个时间步进入隐藏状态,而不仅仅是最后一个.

为了尝试这个想法,我采用了固定长度的方法.我目前使用随机件的批量说每60个字符了我更长的时间序列,并且运行我的手工双向分类zero_state作为initial_state每个60封件.

这工作得很好,但显然不是很完美,因为实际上序列更长,并且从我从原始源中随机剪切的部分左右的信息丢失了.

现在为了推进我想要使用整个序列.它们的长度差异很大,我无法将整个序列(进一步批量)放到GPU上.

我在dynamic_rnn文档中找到了swap_memory - 参数.那会有帮助吗?

我没有找到任何有助于我理解的文档.而且我不能轻易地自己尝试这个,因为我需要在每个时间步都访问隐藏状态,因此我编写了当前图形而不使用任何更高级别的包装器(例如dynamic_rnn).尝试这一点需要我从包装器中获取所有中间状态,据我所知,这是很多工作要实现的.

在经历尝试这个问题的麻烦之前,我很想确定这确实会解决我的记忆问题.Thx任何提示!

lstm tensorflow recurrent-neural-network

6
推荐指数
1
解决办法
905
查看次数

TensorFlow中的参数"state_is_tuple"用于什么?

我试图弄清楚张量流代码的结构(r0.11),并且在理解RNN中使用的"state_is_tuple"参数(目前正在查看LSTM)时遇到问题.

在这篇文章中,当state_is_tuple = True时,如何设置TensorFlow RNN状态?据说state_is_tuple选项设置了隐藏神经元的状态,并且单元状态是否保存在元组中.

所以我的问题是:为什么这个参数存在?它用于什么,为什么我要打扰?在什么情况下我应该将其设置为True/False?

谢谢你的帮助!

python parameters lstm tensorflow recurrent-neural-network

5
推荐指数
1
解决办法
5931
查看次数