将 dynamic_rnn 与 multiRNN 一起使用会产生错误

using dynamic_rnn with multiRNN gives error

我想创建一个 dynamic_rnn 在 python 中使用 tensorflow 和多 LSTM 单元。 在互联网上进行表格搜索我发现了这段代码:

import tensorflow as tf

batch_size = 30
truncated_series_length = 4
num_layers = 3
state_size = 300

x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1])


cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True)
outputs, state = tf.nn.dynamic_rnn(cell, x_input, dtype=tf.float32)

但是当我 运行 这段代码发生错误时:

ValueError: Dimensions must be equal, but are 600 and 301 for 'rnn/while/rnn/multi_rnn_cell/cell_0/cell_0/lstm_cell/MatMul_1' (op: 'MatMul') with input shapes: [30,600], [301,1200].

但是当我设置num_layers = 1 时,没有任何错误。 你知道这个错误是从哪里来的吗?

我想问题在这里大致解决了:https://github.com/tensorflow/tensorflow/issues/16186

基本上,详细说明这个问题的答案: 使用 [cell]*num_layers 将创建一个列表,其中包含对同一单元格实例的两个引用,而不是两个单独的实例。正确的行为是第一层的 LSTM 单元的权重形状应为 (dimensionality_of_feature + cell_state_size, 4*cell_state_size)。 连续层的 LSTM 单元的权重形状应为 (2*cell_state_size, 4*cell_state_size)。因为他们不再接受原始输入而是来自上一层的输入。

但共享参考代码中的问题是,由于 "they" 实际上是相同的单元实例,因此对于两个层,它们将使用相同的内核。因此,即使你有多个层,除了第一层之外的所有层都会有错误的重量形状(总是指第一层的重量)。

如本期所述,更好的代码是使用列表理解或 for 循环来创建多个单独的实例以避免共享引用。

同样的错误发生在我运行代码如下: one_cell = tf.nn.rnn_cell.LSTMCell(num_units=rnn_size) cell = tf.nn.rnn_cell.MultiRNNCell([one_cell for _ in range(num_layers)]) # same as [one_cell]*num_layers ?

但是当我运行下面的代码时,这个错误就消失了。 cell = tf.nn.rnn_cell.MultiRNNCell([tf.nn.rnn_cell.LSTMCell(num_units=rnn_size) for _ in range(num_layers)])

所以我认为操作 [one_cell for _ in range(num_layers)][one_cell]*num_layers 将使所有单元格保持相同的设置。但是我们希望第一层单元格与其他层单元格具有不同的设置。