2017-05-13 2 views
0

Eine Erweiterung auf: What is the use of a "reuse" parameter of tf.contrib.layers functions?.TensorFlow (v1.1.0) Multi-RNN BasicLSTMCell Fehler ('Wiederverwendung' Parameter) Python 3.5

Die Frage: Obwohl dieses Problem auf GitHub angesprochen wurde und wahrscheinlich in einer anderen Version von TensorFlow behandelt wird, habe ich vorläufig keine bestehende Lösung gefunden; Gibt es eine Stop-Gap-Maßnahme, die in der Zwischenzeit funktionieren könnte?

Code:

state_size = 4 
def lstm_cell(): 
    if 'reuse' in inspect.getargspec(tf.contrib.rnn.BasicLSTMCell.__init__).args: 
     return tf.contrib.rnn.BasicLSTMCell(state_size, forget_bias=0.0, state_is_tuple=True, reuse=tf.get_variable_scope().reuse) 
    else: 
     return tf.contrib.rnn.BasicLSTMCell(state_size, forget_bias=0.0, state_is_tuple=True) 

cell = lstm_cell() 
cell = rnn.DropoutWrapper(cell, output_keep_prob=0.5) 
cell = rnn.MultiRNNCell([cell] * num_layers, state_is_tuple=True) 
states_series, current_state = tf.nn.dynamic_rnn(cell, tf.expand_dims(batchX_placeholder, -1), initial_state=rnn_tuple_state) 
states_series = tf.reshape(states_series, [-1, state_size]) 

Die Funktion lstm_cell() ist ein Vorschlag von https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py. Es wird erläutert, dass die neueste Version von Tensorflow den Parameter 'reuse' für BasicLSTMCell() enthält.

In diesem Code, wenn ich False Wiederverwendung gesetzt, erzeugt tf.nn.dynamic_rnn Linie den Fehler:

  • „Valueerror: Variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/Gewichte bereits vorhanden ist, nicht zulässig .? meinst du Wiederverwendung = True in VarScope Ursprünglich definiert, bei einzustellen: ...“

Wenn ich wiederverwenden auf True, der Fehler ist:

  • "ValueError: Versuch, RNNCell mit einem anderen Variablenbereich wiederzuverwenden als seine erste Verwendung. Die erste Verwendung der Zelle erfolgte mit dem Gültigkeitsbereich 'rnn/multi_rnn_cell/cell_0/basic_lstm_cell', dieser Versuch ist mit scope 'rnn/multi_rnn_cell/cell_1/basic_lstm_cell'. Bitte erstellen Sie eine neue Instanz der Zelle , wenn Sie einen anderen Satz von Gewichten verwenden möchten. Wenn Sie zuvor: MultiRNNCell ([BasicLSTMCell (...)] * num_layers) verwendet haben, ändern Sie zu: MultiRNNCell ([BasicLSTMCell (...) für _ im Bereich (num_layers)]). Wenn bevor Sie die gleiche Zelle Instanz wie die Forward-Zelle und umgekehrte Zelle eines bidirektionalen RNN verwenden, erstellen Sie einfach zwei Instanzen (eine für Forward, eine für Reverse). Im Mai 2017 werden wir starten, um das Verhalten dieser Zelle zu ändern, um vorhandene gespeicherte Gewichtungen zu verwenden, wenn any, wenn es mit scope = None aufgerufen wird (was zu stiller Modellverschlechterung führen kann, so bleibt dieser Fehler bis dahin.)

Schließlich Zugabe in 'scope = keine' zu dynamic_rnn bietet keinen entweder Unterschied.

Antwort

0

Haben Sie darüber nachgedacht versuchen, was die ‚Wiederverwendung True'-Fehler ist darauf hindeutet?

If before you were using: MultiRNNCell([BasicLSTMCell(...)] * num_layers), change to: MultiRNNCell([BasicLSTMCell(...) for _ in range(num_layers)]).

folgende Code abgeschnitten funktioniert für mich (bereits beantwortet here)

def lstm_cell(): 
    cell = tf.contrib.rnn.NASCell(state_size, reuse=tf.get_variable_scope().reuse) 
    return tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=0.8) 

rnn_cells = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(num_layers)], state_is_tuple = True) 
outputs, current_state = tf.nn.dynamic_rnn(rnn_cells, x, initial_state=rnn_tuple_state) 
+1

Funktioniert tatsächlich, danke! – mjfred