Python 将动态rnn与多rnn结合使用会产生错误
我想用python中的tensorflow和多个LSTM单元创建一个动态的rnn。 在internet上搜索表单我发现以下代码:Python 将动态rnn与多rnn结合使用会产生错误,python,tensorflow,lstm,rnn,Python,Tensorflow,Lstm,Rnn,我想用python中的tensorflow和多个LSTM单元创建一个动态的rnn。 在internet上搜索表单我发现以下代码: 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]) ce
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')的尺寸必须相等,但输入形状为[30600],[3011200]的尺寸为600和301
但是当我设置num_layers=1时,没有任何错误。
你知道这个错误是从哪里来的吗?我想这里大致解决了这个问题: 基本上,要详细说明这个问题的答案: 使用
[cell]*num_layers
将创建一个列表,其中包含对同一个cell实例的两个引用,而不是两个单独的实例。正确的行为是,第一层的LSTM单元应具有类似的权重形状(特征的维数+单元状态大小,4*单元状态大小)。
连续层中的LSTM单元应具有类似(2*单元状态大小,4*单元状态大小)的权重形状。因为它们不再接受原始输入,而是来自上一层的输入
但共享参考代码中的问题是,对于这两个层,它们将使用相同的内核,因为“它们”实际上是相同的单元实例。因此,即使有多个层,除第一层之外的所有层的权重形状都会错误(始终指第一层的权重)
如本期所述,更好的代码是使用列表理解或for循环来创建多个单独的实例,以避免共享引用 我认为问题大致可以在这里解决: 基本上,要详细说明这个问题的答案: 使用
[cell]*num_layers
将创建一个列表,其中包含对同一个cell实例的两个引用,而不是两个单独的实例。正确的行为是,第一层的LSTM单元应具有类似的权重形状(特征的维数+单元状态大小,4*单元状态大小)。
连续层中的LSTM单元应具有类似(2*单元状态大小,4*单元状态大小)的权重形状。因为它们不再接受原始输入,而是来自上一层的输入
但共享参考代码中的问题是,对于这两个层,它们将使用相同的内核,因为“它们”实际上是相同的单元实例。因此,即使有多个层,除第一层之外的所有层的权重形状都会错误(始终指第一层的权重)
如本期所述,更好的代码是使用列表理解或for循环来创建多个单独的实例,以避免共享引用 运行代码时发生了相同的错误,如下所示:
一个单元=tf.nn.rnn单元.LSTMCell(num单元=rnn单元大小)
cell=tf.nn.rnn_cell.multirncell([1_cell for u in range(num_layers)])#与[1_cell]*num_layers相同?
但是当我运行下面的代码时,这个错误消失了。
cell=tf.nn.rnn\u cell.MultiRNNCell([tf.nn.rnn\u cell.LSTMCell(num\u units=rnn\u size)用于范围内(num\u层)])
因此,我认为操作
[one_cell for uu in range(num_layers)]
和[one_cell]*num_layers
将保持所有单元格的设置相同。但是我们希望第一层单元格与其他层单元格具有不同的设置。运行代码时出现相同的错误,如下所示:
一个单元=tf.nn.rnn单元.LSTMCell(num单元=rnn单元大小)
cell=tf.nn.rnn_cell.multirncell([1_cell for u in range(num_layers)])#与[1_cell]*num_layers相同?
但是当我运行下面的代码时,这个错误消失了。
cell=tf.nn.rnn\u cell.MultiRNNCell([tf.nn.rnn\u cell.LSTMCell(num\u units=rnn\u size)用于范围内(num\u层)])
因此,我认为操作[one_cell for uu in range(num_layers)]
和[one_cell]*num_layers
将保持所有单元格的设置相同。但我们希望第一层单元与其他层单元具有不同的设置