如何使用 dynamic_rnn 获取多层 RNN 中每个步骤和每个层的状态
How to get the states for each step and for each layer in a multilayer RNN using dynamic_rnn
我正在构建一个多层 RNN,其设置与(使用 MultiRNNCell 包裹细胞,然后使用 dynamic_rnn 调用)相同:
并且如上述问题所述,dynamic_rnn returns
输出,状态 = tf.nn.dynamic_rnn(...)
输出只提供了我猜想来自顶层的输出(因为形状是batch_size x steps x state_size)。但是,状态 return 每层的输出(具有 num_layer 个元素的元组,每个元素都包含该层的最后一个状态)。
(1) 有什么方法可以评估所有时间步的输出 每一层 (不仅仅是最后一层 return 由 dynamic_rnn) 在没有 运行 递归一步 RNN 的情况下以简单的方式读取每一步的状态?
(2) 输出 returned 是否指示最后(顶层)层?
根据 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
,它们确实来自顶层。
我正在构建一个多层 RNN,其设置与(使用 MultiRNNCell 包裹细胞,然后使用 dynamic_rnn 调用)相同:
并且如上述问题所述,dynamic_rnn returns 输出,状态 = tf.nn.dynamic_rnn(...)
输出只提供了我猜想来自顶层的输出(因为形状是batch_size x steps x state_size)。但是,状态 return 每层的输出(具有 num_layer 个元素的元组,每个元素都包含该层的最后一个状态)。
(1) 有什么方法可以评估所有时间步的输出 每一层 (不仅仅是最后一层 return 由 dynamic_rnn) 在没有 运行 递归一步 RNN 的情况下以简单的方式读取每一步的状态?
(2) 输出 returned 是否指示最后(顶层)层?
根据 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
,它们确实来自顶层。