2016-08-07 8 views
5

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!

Antwort

1

Das Problem tritt höchstwahrscheinlich aufgrund der gleichzeitigen Ausführung verschiedener Sitzungsobjekte auf. Ich habe die Sitzung des ersten Modells vom Hintergrundthread zum Hauptthread verschoben, das kontrollierte Experiment mehrere Male wiederholt (läuft über 24 Stunden und erreichte die Konvergenz) und habe nie beobachtet NaN. Auf der anderen Seite divergiert die gleichzeitige Ausführung das Modell innerhalb weniger Minuten.

Ich habe meinen Code neu strukturiert, um ein gemeinsames Sitzungsobjekt für alle Modelle zu verwenden.

+0

Ich habe genau das gleiche Problem. Können Sie bitte Ihre Lösung ausarbeiten? –

+1

"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

Verwandte Themen