将dynamic_rnn与multiRNN一起使用会导致错误

时间:2018-02-19 11:47:52

标签: python tensorflow lstm rnn

我想使用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时,没有任何错误。 你知道这个错误来自哪里吗?

2 个答案:

答案 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将使所有单元格保持相同的设置。但是我们希望第一层单元格与其他层单元格具有不同的设置。