我想使用Multi LSTM单元格在python中使用tensorflow创建dynamic_rnn。 互联网上的表格搜索我找到了这个代码:
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:尺寸必须相等,但对于' rnn / while / rnn / multi_rnn_cell / cell_0 / cell_0 / lstm_cell / MatMul_1' (op:' MatMul')输入形状:[30,600],[301,1200]。
但是当我设置num_layers = 1时,没有任何错误。 你知道这个错误来自哪里吗?
答案 0 :(得分:2)
我认为问题大致在此解决: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)的权重形状。因为他们不再采用原始输入而是从前一层输入。
但是共享参考代码中的问题是,对于这两个层,它们将使用相同的内核,因为"它们"实际上是同一个单元格实例。因此,即使您有多个图层,除了第一个图层之外的所有图层都将具有错误的权重形状(始终指的是第一个图层的权重)。
此问题中指出的更好的代码是使用list comprehension或for循环来创建多个单独的实例以避免共享引用。
答案 1 :(得分:0)
按以下方式运行代码时发生了相同的错误:
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
将使所有单元格保持相同的设置。但是我们希望第一层单元格与其他层单元格具有不同的设置。