2

Ich versuche ein Tensorflow-Diagramm zu machen, wo ein Teil des Graphen bereits vortrainiert ist und im Vorhersage-Modus läuft, während der Rest trainiert. Ich habe wie so meine vortrainiert Zelle definiert:Wie macht man die Gewichte einer RNN-Zelle im Tensorflow unzugänglich?

rnn_cell = tf.contrib.rnn.BasicLSTMCell(100) 

state0 = tf.Variable(pretrained_state0,trainable=False) 
state1 = tf.Variable(pretrained_state1,trainable=False) 
pretrained_state = [state0, state1] 

outputs, states = tf.contrib.rnn.static_rnn(rnn_cell, 
              data_input, 
              dtype=tf.float32, 
              initial_state = pretrained_state) 

die anfänglichen Variablen trainable=False Einstellung hilft nicht. Diese werden nur verwendet, um die Gewichte zu initialisieren, und als Ergebnis ändern sich die Gewichte noch.

Ich muss noch einen Optimierer in meinem Trainingsschritt ausführen, da der Rest meines Modells trainieren muss. Aber wie kann ich verhindern, dass der Optimierer die Gewichte in dieser Zelle ändert?

Gibt es eine rnn_cell entspricht trainable=False?

+0

Die Ausgabe des vortrainierten Modells ist eine Eingabe von Ihrem neuen Modell trainiert werden? Wenn ja, warum nicht einfach das vortrainierte Modell vorberechnen? Ich meine, dass nur zwei Grafiken unabhängig voneinander bleiben. –

+0

@YuwenYan Sie haben Recht, ich könnte das tun. Ich hatte gehofft, Vorberechnung zu vermeiden, indem ich die zwei Diagramme zusammen laufen ließ, da es einfacher wäre, sicherzustellen, dass alle Daten aufgereiht sind und einen Schritt jedes Mal speicherten, wenn ich das vortrainierte Modell ändern wollte – AlexR

Antwort

1

Sie können entweder tf.stop_gradient() verwenden, um zu verhindern, dass die pretrained Teile des Graphen seine Gewichte aktualisieren, oder Sie können optimiser() verwenden, wo Sie angeben können, welche Teile des Graphen trainiert werden sollen. Die zweite Methode würde beinhalten:

#Create variable scope for the trainable parts of the graph: tf.variable_scope('train'). 

# get trainable variables 
t_vars = tf.trainable_variables() 
train_vars = [var for var in t_vars if var.name.startswith('train')] 
# train only the variables of a particular scope 
opt = optimizer.minimize(cost, var_list=train_vars) 
+0

die Antwort –

+0

Das sieht aus wie ich brauche. Seltsamerweise jedoch verhindert es nur, dass die Trainingsgewichte ANN-Gewichte erhalten, nicht die RNN-Gewichte. Ich werde weiter nachsehen. Haben Sie schon einmal mit RNN-Gewichten gearbeitet oder ein Beispiel gesehen? – AlexR

+0

Es funktioniert für alles. Verwenden Sie tf.variable_scope() weisen Sie den Variablenbereich für das Training zu und verwenden Sie dann nur diejenigen Variablen, die im Bereich definiert sind, um sie in optimizer.minimize() zu aktualisieren. –

Verwandte Themen