如何使用 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 中使用可变序列长度时是不是应该进行丢失屏蔽