Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将动态rnn与多rnn结合使用会产生错误_Python_Tensorflow_Lstm_Rnn - Fatal编程技术网

Python 将动态rnn与多rnn结合使用会产生错误

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

我想用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])


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