Tensorflow dynamic_rnn参数含义

Ant*_*ton 11 tensorflow

我很难理解神秘的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)
Run Code Online (Sandbox Code Playgroud)

我很难理解这些参数如何与数学LSTM方程和RNN定义相关.单元格展开的大小在哪里?它是由输入的'max_time'维度定义的吗?batch_size只是分割长数据的便利还是与minibatch SGD有关?输出状态是否通过批次传递?

Flo*_*ker 17

tf.nn.dynamic_rnn 接收不相关序列的批次(具有小批量意义).

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

在上面的代码中,无论是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})
Run Code Online (Sandbox Code Playgroud)

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