2017-05-29 70 views
0

我Tensorflow 1.1.0MulticellRNN误差Tensorflow

和我下面从https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb在多小区基本教程(堆放)RNNs

下面的代码生成一个奇怪的错误,我想不通为什么从搜索。

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月,我们将开始将此单元格的行为转换为使用现有存储的权重(如果有的话),当调用范围=无(可能会导致模型无声降级,因此此错误将保持到此时为止。)

我在Github的代码中加入了一个我开关的部分。 任何想法为什么这仍然抛出一个错误? 非常感谢帮助!

回答

1

在这行代码:

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) 

然后用create_rnn_layer(n_neurons)替换basic_cell。这样,当网络被创建时。该函数将被称为n_layers次,因此将使用不同的权重。