2017-05-29 8 views
0

Ich habe Tensorflow 1.1.0MulticellRNN Fehler bei Tensorflow

Und bin nach ein grundlegendes Tutorial von https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb auf ulticell (gestapelt) RNNs

Der folgende Code erzeugt eine ungerade Fehler und ich kann nicht herausfinden, warum von der Suche.

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

Dies scheint den richtigen Code zu sein, aber es wird die Fehlermeldung:

Valueerror: Versuch RNNCell mit einem anderen Variable Umfang als sein erster Einsatz wieder zu verwenden. Die erste Verwendung der Zelle war mit dem Bereich 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell', dieser Versuch ist mit dem Bereich 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell'. Erstellen Sie eine neue Instanz der Zelle, wenn Sie möchten, dass eine andere Gruppe von Gewichtungen verwendet wird. Wenn Sie zuvor: MultiRNNCell ([BasicRNNCell (...)] * num_layers) verwendet haben, wechseln Sie zu: MultiRNNCell ([BasicRNNCell (...) for _ im Bereich (num_layers)]). Wenn Sie zuvor die gleiche Zelleninstanz wie die Vorwärts- und Rückwärtszelle einer bidirektionalen RNN verwendet haben, erstellen Sie einfach zwei Instanzen (eine für Vorwärts, eine für Rückwärts). Im Mai 2017 werden wir damit beginnen, das Verhalten dieser Zelle so zu ändern, dass sie vorhandene gespeicherte Gewichtungen verwendet, wenn sie mit scope = None aufgerufen wird (was zu einer Verschlechterung des Silent-Modells führen kann).

Ich habe einen Teil, aus dem ich gewechselt habe, aus dem Code im Github herausgefiltert. Irgendeine Idee, warum dies immer noch einen Fehler wirft? Hilfe wird sehr geschätzt!

Antwort

1

In dieser Codezeile:

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

Die basic_cell Variable muss mit einer Funktion ersetzt werden. Wenn Sie eine Variable verwenden, verwendet jede Schicht des n_layers-Netzwerks denselben Satz von Gewichtungen. Stattdessen versuchen, eine Funktion zu verwenden:

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

Dann ersetzen basic_cell mit create_rnn_layer (n_neurons). Auf diese Weise, wenn das Netzwerk erstellt wird. Die Funktion wird n_layers von Zeiten genannt und verwendet daher verschiedene Gewichte.