Tensorflow 的 MulticellRNN 错误
MulticellRNN Error with Tensorflow
我有 Tensorflow 1.1.0
我正在学习 https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb 关于多单元(堆叠)RNN 的基本教程
下面的代码产生了一个奇怪的错误,我无法通过搜索找出原因。
import tensorflow as tf
n_inputs = 2
n_neurons = 100
n_layers = 3
n_steps = 5
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
这似乎是正确的代码,但出现错误:
ValueError:尝试以不同于第一次使用的变量范围重用 RNNCell。第一次使用 cell 的范围为 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell',这次尝试的范围为 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell'。如果您希望它使用一组不同的权重,请创建一个新的单元格实例。 如果之前使用:MultiRNNCell([BasicRNNCell(...)] * num_layers),请更改为:MultiRNNCell([BasicRNNCell(...) for _ in range(num_layers)]). 如果在使用同一个单元实例作为双向 RNN 的正向和反向单元之前,只需创建两个实例(一个用于正向,一个用于反向)。 2017 年 5 月,当使用 scope=None 调用时,我们将开始将该单元格的行为转换为使用现有的存储权重(如果有的话)(这可能导致静默模型降级,因此此错误将一直存在到那时。)
我将我从 Github 中的代码切换到的部分加粗了。
知道为什么这仍然会引发错误吗?
非常感谢您的帮助!
在这行代码中:
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
basic_cell变量需要用函数替换。当您使用变量时,n_layers 网络的每一层都将使用同一组权重。相反,尝试使用函数:
def create_rnn_layer(n_neurons):
return tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
然后将basic_cell替换为create_rnn_layer(n_neurons)。这样,在创建网络时。该函数将被调用 n_layers 次,因此将使用不同的权重。
我有 Tensorflow 1.1.0
我正在学习 https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb 关于多单元(堆叠)RNN 的基本教程
下面的代码产生了一个奇怪的错误,我无法通过搜索找出原因。
import tensorflow as tf
n_inputs = 2
n_neurons = 100
n_layers = 3
n_steps = 5
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
这似乎是正确的代码,但出现错误:
ValueError:尝试以不同于第一次使用的变量范围重用 RNNCell。第一次使用 cell 的范围为 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell',这次尝试的范围为 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell'。如果您希望它使用一组不同的权重,请创建一个新的单元格实例。 如果之前使用:MultiRNNCell([BasicRNNCell(...)] * num_layers),请更改为:MultiRNNCell([BasicRNNCell(...) for _ in range(num_layers)]). 如果在使用同一个单元实例作为双向 RNN 的正向和反向单元之前,只需创建两个实例(一个用于正向,一个用于反向)。 2017 年 5 月,当使用 scope=None 调用时,我们将开始将该单元格的行为转换为使用现有的存储权重(如果有的话)(这可能导致静默模型降级,因此此错误将一直存在到那时。)
我将我从 Github 中的代码切换到的部分加粗了。 知道为什么这仍然会引发错误吗? 非常感谢您的帮助!
在这行代码中:
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
basic_cell变量需要用函数替换。当您使用变量时,n_layers 网络的每一层都将使用同一组权重。相反,尝试使用函数:
def create_rnn_layer(n_neurons):
return tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
然后将basic_cell替换为create_rnn_layer(n_neurons)。这样,在创建网络时。该函数将被调用 n_layers 次,因此将使用不同的权重。