2017-05-29 1 views
0

Je tensorflow 1.1.0MulticellRNN Erreur avec tensorflow

Et je suivais un tutoriel de base de https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb sur multicellulaire (empilés) RNNs

Le code suivant génère une erreur bizarre et je ne peux pas comprendre pourquoi de la recherche.

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() 

Cela semble être le bon code, mais il obtient l'erreur:

ValueError: Tentative de réutilisation RNNCell avec une portée variable différente de sa première utilisation. La première utilisation de la cellule était avec la portée 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell', cette tentative est avec la portée 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell'. Veuillez créer une nouvelle instance de la cellule si vous souhaitez qu'elle utilise un ensemble de poids différent. Si auparavant vous utilisiez: MultiRNNCell ([BasicRNNCell (...)] * num_layers), changez pour: MultiRNNCell ([BasicRNNCell (...) pour _ in range (num_layers)]). Si vous utilisiez auparavant la même instance de cellule que la cellule directe et la cellule inverse d'un RNN bidirectionnel, créez simplement deux instances (une pour l'avant, une pour l'inverse). En mai 2017, nous commencerons à faire passer le comportement de cette cellule pour utiliser les poids stockés existants, le cas échéant, avec scope = None (ce qui peut entraîner une dégradation silencieuse du modèle, donc cette erreur persistera.)

J'ai mis en gras une partie que j'ai fait passer du code dans le Github. Avez-vous une idée de la raison pour laquelle cela continue à générer une erreur? L'aide est très appréciée!

Répondre

1

Dans cette ligne de code:

multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)]) 

La variable basic_cell doit être remplacée par une fonction. Lorsque vous utilisez une variable, chaque couche du réseau n_layers utilise le même ensemble de poids. Au lieu de cela, en essayant d'utiliser une fonction:

def create_rnn_layer(n_neurons): 
    return tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) 

Puis basic_cell avec remplacer create_rnn_layer (n_neurons). De cette façon, lorsque le réseau est créé. La fonction sera appelée n_layers of times, donc utilisera des poids différents.