如何使用 dynamic_rnn 获取多层 RNN 中每一步和每一层的状态

Posted

技术标签:

【中文标题】如何使用 dynamic_rnn 获取多层 RNN 中每一步和每一层的状态【英文标题】:How to get the states for each step and for each layer in a multilayer RNN using dynamic_rnn 【发布时间】:2019-12-04 06:36:05 【问题描述】:

我正在构建一个与中设置相同的多层 RNN(使用 MultiRNNCell 包裹单元格,然后使用 dynamic_rnn 调用):

Outputs and State of MultiRNNCell in Tensorflow

如上述问题所述,dynamic_rnn 返回 输出,状态 = tf.nn.dynamic_rnn(...)

输出仅提供我猜来自顶层的输出(因为形状是 batch_size x steps x state_size)。但是,状态会返回每一层的输出(元组有 num_layer 元素,每个元素都包含该层的最后一个状态)。

(1) 有没有什么方法可以以简单的方式评估所有时间步的输出每一层(不仅仅是由 dynamic_rnn 返回的最后一层),而无需运行一个-递归执行RNN并读取每一步的状态?

(2) 是否为最后(顶层)层指示返回的输出?

【问题讨论】:

【参考方案1】:

根据tf.nn.rnn_cell.MultiRNNCell 的文档,您应该可以安全地执行以下操作:

cell_1 = tf.nn.rnn_cell.GRUCell(7, name="gru1")
cell_2 = tf.nn.rnn_cell.GRUCell(7, name="gru2")
outputs_1, states_1 = tf.nn.dynamic_rnn(cell_1, X, dtype=tf.float32)
outputs_2, states_2 = tf.nn.dynamic_rnn(cell_2, outputs_1, dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    first_layer_outputs = sess.run(outputs_1)
    second_layer_outputs = sess.run(outputs_2)

tf.nn.dynamic_rnn返回的输出,如果提供的单元格为tf.nn.rnn_cell.MultiRNNCell,则确实来自顶层。

【讨论】:

以上是关于如何使用 dynamic_rnn 获取多层 RNN 中每一步和每一层的状态的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?

在 Dynamic_RNN 中使用可变序列长度时是不是应该进行丢失屏蔽

Tensorflow 与 Keras 中的 RNN,tf.nn.dynamic_rnn() 的贬值

tf.dynamic_rnn

tf.nn.dynamic_rnn 中的排名错误

tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别