Mehrere Sitzungen und Grafiken in Tensorflow (im selben Prozess)
Ich trainiere ein Modell, bei dem der Eingabevektor die Ausgabe eines anderen Modells ist. Dies beinhaltet das Wiederherstellen des ersten Modells aus einer Prüfpunktdatei, während das zweite Modell von Grund auf neu initialisiert wird (mittf.initialize_variables()
) im selben Prozess.
Es gibt eine erhebliche Menge an Code und Abstraktion, daher füge ich hier nur die relevanten Abschnitte ein.
Das Folgende ist der Wiederherstellungscode:
self.variables = [var for var in all_vars if var.name.startswith(self.name)]
saver = tf.train.Saver(self.variables, max_to_keep=3)
self.save_path = tf.train.latest_checkpoint(os.path.dirname(self.checkpoint_path))
if should_restore:
self.saver.restore(self.sess, save_path)
else:
self.sess.run(tf.initialize_variables(self.variables))
Jedes Modell ist in einem eigenen Diagramm und einer eigenen Sitzung wie folgt unterteilt:
self.graph = tf.Graph()
self.sess = tf.Session(graph=self.graph)
with self.sess.graph.as_default():
# Create variables and ops.
Alle Variablen in jedem Modell werden in @ erstellvariable_scope
context manager.
Die Fütterung funktioniert wie folgt:
Ein Hintergrund-Thread ruft @ asess.run(inference_op)
aufinput = scipy.misc.imread(X)
und stellt das Ergebnis in eine blockierende thread-sichere Warteschlange. Die Haupttrainingsschleife liest aus der Warteschlange und ruft @ asess.run(train_op)
auf dem zweiten Modell.PROBLEM
Ich beobachte, dass sich die Verlustwerte selbst in der ersten Iteration des Trainings (zweites Modell) über Läufe hinweg drastisch ändern (und in einigen Iterationen zu Nan werden). Ich habe bestätigt, dass die Ausgabe des ersten Modells jedes Mal genau gleich ist. @ Auskommentiersess.run
des ersten Modells und das Ersetzen durch identische Eingaben aus einer eingelegten Datei zeigen dieses Verhalten nicht.
Dies ist dastrain_op
:
loss_op = tf.nn.sparse_softmax_cross_entropy(network.feedforward())
# Apply gradients.
with tf.control_dependencies([loss_op]):
opt = tf.train.GradientDescentOptimizer(lr)
grads = opt.compute_gradients(loss_op)
apply_gradient_op = opt.apply_gradients(grads)
return apply_gradient_op
Ich weiß, dass dies vage ist, aber ich gebe gerne weitere Details bekannt. Jede Hilfe wird gebeten!