2017-10-30 3 views
0

Hier ist mein Code im Tensor Flow, ich habe eine Bi-LSTM definiert und für eine bestimmte Aufgabe muss ich über meine Grafik Schleife. obwohl ich Wiederverwendung = True in Scope Variable gesetzt habe, aber es erzeugt den Fehler, der unter dem Code erwähnt wird.TensorFlow Wiederverwendung Variable Scope

for run in range(0, 2): 


    with tf.variable_scope("LSTM", reuse= True) as scope: 

    def LSTM(input_data): 



     LSTM_cell_fw= tf.contrib.rnn.BasicLSTMCell(num_units= hidden_size) 
     LSTM_cell_bw= tf.contrib.rnn.BasicLSTMCell(num_units= hidden_size)   
     output, states = tf.nn.bidirectional_dynamic_rnn(LSTM_cell_fw, LSTM_cell_bw, inputs= input_data, dtype=tf.float32) 
     output_1= output[0] 
     output_2= output[1] 
     output_1= output_1[-1, -1, :] 
     output_1= tf.reshape(output_1, shape= (1, hidden_size)) 
     output_2= output_2[-1, -1, :] 
     output_2= tf.reshape(output_2, shape= (1, hidden_size)) 
     fin_output= tf.concat((output_1, output_2), axis=1) 

     return fin_output 

und der Fehler ist: Valueerror: Variable bidirectional_rnn/fw/basic_lstm_cell/kernel bereits vorhanden ist, nicht zulässig. Wollten Sie in VarScope reuse = True setzen? Ursprünglich definiert unter:

File "alpha-rep.py", Zeile 65, in LSTM Ausgang, besagt = tf.nn.bidirectional_dynamic_rnn (LSTM_cell_fw, LSTM_cell_bw, Eingänge = INPUT_DATA, dtype = tf.float32) File " alpha-rep.py“, Linie 77, in out = LSTM (INPUT_DATA)

Antwort

1

eine Variable wieder zu verwenden Sie zuerst müssen sie definieren, nach nur, dass Sie es wiederverwenden können.

Definieren Sie die Funktion zum Definieren der Variablen:

def LSTM(input_data): 
    LSTM_cell_fw= tf.contrib.rnn.BasicLSTMCell(num_units= hidden_size) 
    LSTM_cell_bw= tf.contrib.rnn.BasicLSTMCell(num_units= hidden_size)   
    output, states = tf.nn.bidirectional_dynamic_rnn(LSTM_cell_fw, LSTM_cell_bw, inputs= input_data, dtype=tf.float32) 
    output_1= output[0] 
    output_2= output[1] 
    output_1= output_1[-1, -1, :] 
    output_1= tf.reshape(output_1, shape= (1, hidden_size)) 
    output_2= output_2[-1, -1, :] 
    output_2= tf.reshape(output_2, shape= (1, hidden_size)) 
    return tf.concat((output_1, output_2), axis=1) 

Dann rufen Sie es zum ersten Mal die Variablen zu definieren und es unter dem gewünschten Umfang platzieren:

with tf.variable_scope("LSTM", reuse=False) as scope: 
    first = LSTM(your_input_here) 

Jetzt können Sie andere definieren Schichten unter dem gleichen Umfang, die bereits definierten Variablen wiederverwenden:

with tf.variable_scope("LSTM", reuse=True) as scope: 
    second = LSTM(your_other_input_here) 
+0

Vielen Dank für Ihre Antwort, Du meinst zum Beispiel hier zum ersten Mal, dass der Graph funktioniert (run = 0), die Wiederverwendung soll falsch sein und wenn run> 0 ist, soll es wahr sein, oder? – Maz

+0

Es hat perfekt funktioniert, danke – Maz

+0

Gern geschehen! – nessuno