【问题标题】:Tensorflow dynamic_rnn parameters meaningtensorflow dynamic_rnn 参数含义
【发布时间】:2017-08-08 19:44:51
【问题描述】:

我很难理解神秘的 RNN 文档。任何有关以下内容的帮助将不胜感激。

tf.nn.dynamic_rnn(cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=False, time_major=False, scope=None)

我很难理解这些参数与数学 LSTM 方程和 RNN 定义之间的关系。单元格展开大小在哪里?它是由输入的“max_time”维度定义的吗? batch_size 只是为了方便拆分长数据还是与 minibatch SGD 有关?输出状态是否跨批次传递?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    tf.nn.dynamic_rnn 接收一批(具有 minibatch 含义)不相关的序列。

    • cell 是您要使用的实际单元格(LSTM、GRU、...)
    • inputs 的形状为 batch_size x max_time x input_size,其中 max_time 是最长序列中的步数(但所有序列的长度可以相同)
    • sequence_length 是一个大小为 batch_size 的向量,其中每个元素都给出了批次中每个序列的长度(如果所有序列的大小相同,则将其保留为默认值。此参数是定义单元格展开大小。

    隐藏状态处理

    处理隐藏状态的常用方法是在dynamic_rnn 之前定义一个初始状态张量,例如:

    hidden_state_in = cell.zero_state(batch_size, tf.float32) 
    output, hidden_state_out = tf.nn.dynamic_rnn(cell, 
                                                 inputs,
                                                 initial_state=hidden_state_in,
                                                 ...)
    

    在上面的 sn-p 中,hidden_state_inhidden_state_out 具有相同的形状 [batch_size, ...]实际形状取决于您使用的单元格类型,但重要的是第一个维度是批量大小)。

    这样,dynamic_rnn 对每个序列都有一个初始隐藏状态。 它会自行将inputs 参数中每个序列的隐藏状态逐个传递hidden_state_out 将包含批处理中每个序列的最终输出状态。同一批次的序列之间不传递隐藏状态,仅在同一序列的时间步之间传递。

    什么时候需要手动反馈隐藏状态?

    通常,当你训练时,每个批次都是不相关的,所以你在做session.run(output)时不必反馈隐藏状态。

    但是,如果您正在测试,并且您需要每个时间步的输出,(即您必须在每个时间步执行 session.run()),您将需要使用评估和反馈输出隐藏状态像这样:

    output, hidden_state = sess.run([output, hidden_state_out],
                                    feed_dict={hidden_state_in:hidden_state})
    

    否则 tensorflow 将在每个时间步仅使用默认的 cell.zero_state(batch_size, tf.float32),这相当于在每个时间步重新初始化隐藏状态。

    【讨论】:

    • 谢谢,这很有帮助,我有 95% 在那里 :) minibatches 的概念意义是什么?例如,LSTM 单元可以仅以自己的状态存在,并且可以使用单个数据流进行训练。我想这会在 batch_size = 1 时发生。你说它们是不相关的序列。小批量的概念意义是什么?使用小批量 SGD 进行训练?并行高效训练?
    • 在batch_size = 1时确实会发生这种情况。我们使用批处理训练的原因是因为它使训练更加稳定。与仅基于一个样本的梯度更新相比,根据批次的平均梯度更新权重更有可能使您朝着正确的方向前进。批量大小大于 1 通常只在训练阶段才有意义。
    • 感谢您的精彩解释。我有一个问题的想法。如何显式控制变量batch_size 的值或隐式推断它?有什么指示吗?
    • 我不太清楚你的意思,你能改写你的问题吗?
    • 这有点老了,但是你打算如何定义名为hidden_state_in的占位符的形状?
    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2018-07-06
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多