Ich trainiere ein Modell, wo der Eingabevektor die Ausgabe eines anderen Modells ist. Dies beinhaltet die Wiederherstellung des ersten Modells aus einer Prüfpunktdatei während der Initialisierung des zweiten Modells von Grund auf (unter Verwendung von tf.initialize_variables()
) im selben Prozess.Mehrere Sitzungen und Graphen in Tensorflow (im selben Prozess)
Es gibt eine erhebliche Menge an Code und Abstraktion, also füge ich einfach die relevanten Abschnitte hier ein.
Das Folgende ist die Wiederherstellung Code:
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 innerhalb seiner eigenen Graphen und Sitzung, wie dies scoped ist: die Variablen innerhalb jedes Modell erstellt werden, in der variable_scope
Alle
self.graph = tf.Graph()
self.sess = tf.Session(graph=self.graph)
with self.sess.graph.as_default():
# Create variables and ops.
Kontextmanager.
Die Fütterung funktioniert wie folgt:
- einem Hintergrund-Thread ruft
sess.run(inference_op)
input = scipy.misc.imread(X)
auf und legt das Ergebnis in einer blockierenden threadsicher Warteschlange. - Die Haupttrainingsschleife liest aus der Warteschlange und ruft
sess.run(train_op)
auf dem zweiten Modell auf.
PROBLEM:
Ich beobachte, dass die Verlustwerte, auch in der ersten Iteration des Trainings (zweites Modell) halten drastisch über Läufe zu ändern (und werden nan in wenigen Iterationen). Ich habe bestätigt, dass die Ausgabe des ersten Modells immer die gleiche ist. Das sess.run
des ersten Modells auskommentieren und es durch identische Eingabe aus einer gebeizten Datei ersetzen, zeigt dieses Verhalten nicht.
Dies ist train_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ß, das ist vage, aber ich bin glücklich, mehr Details. Jede Hilfe wird geschätzt!
Ich habe genau das gleiche Problem. Können Sie bitte Ihre Lösung ausarbeiten? –
"sess.run" nicht gleichzeitig ausführen. Tensorflow übernimmt die vollständige Kontrolle über den gesamten (exponierten) GPU-Speicher. Das gleichzeitige Ausführen von 'sess.run' in zwei verschiedenen Prozessen oder Threads führt zu Problemen. – Vikesh