Übersicht: Ich möchte nur ausgewählte Variablen in einem Netzwerk aktualisieren. Das Netzwerk hat Teile A
->B
(in Vorwärtsrichtung) und jeder von ihnen hat separate Verluste La
und Lb
. Ich möchte die Gewichte a
von A
trainieren, um Lb
zu optimieren. Dabei sollten die Gewichte b
von B
festgelegt werden. Wie kann ich das machen?Tensorflow Update nur ausgewählte Variablen
Ansatz 1: nur a
als Variablen Wählen Sie mit var_list
in optimizer.minimize(loss, var_list=[a])
zu minimieren. https://github.com/tensorflow/tensorflow/issues/834. Dies stürzt mit einem Fehler ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables (...) and loss (...)
ab. Das funktioniert in anderen Szenarien auch gut, aber anscheinend mag es nicht, dass Gewichte b
nicht in der var_list sind.
Edit 1: Die Zeile, die den Fehler verursacht: a_optim = tf.train.AdamOptimizer(args.lr, beta1=args.beta1).minimize(self.a_loss, var_list=self.a_vars, global_step=self.global_step)
Ansatz 2: Gleiche wie Ansatz 1, aber auch b
im var_list. Das Problem ist jetzt, dass das Netzwerk a und b aktualisiert, während es die Gradienten nur über B
senden und nur A
aktualisieren sollte.
Edit 2: Die Linie, die funktioniert, aber nicht das, was ich will: a_optim = tf.train.AdamOptimizer(args.lr, beta1=args.beta1).minimize(self.a_loss, var_list=self.a_vars+self.b_vars, global_step=self.global_step)
Ansatz 3: Verwendung tf.stop_gradient(tensor)
Holding variables constant during optimizer. Aus der Dokumentation folgere ich, dass dies nur dazu führt, dass die Gradienten im Diagramm nicht weiter nach links fließen. Ich möchte die Ignoriervariablen auf der rechten Seite.
Ansatz 4: Set tf.Variable(..., trainable=True)
, aber das sieht sehr unflexibel, wenn ich mit dem Training zwischen A und B wechseln will
können Sie einen Beispielcode eingeben, der den Fehler von Approach 1 reproduziert? das sollte der Weg sein, es zu tun. Vielleicht gibt es einen Fehler. Welche Version von Tensorflow verwenden Sie? – fabrizioM
Danke, ich habe zwei Änderungen hinzugefügt, um die Version zu zeigen, die funktioniert und die, die nicht funktioniert. Ich benutze die neueste v. 0.12 von TensorFlow. – nightrome