2016-08-07 18 views
5

Szkolę model, w którym wektor wejściowy jest wyjściem innego modelu. Obejmuje to przywrócenie pierwszego modelu z pliku punktu kontrolnego podczas inicjowania drugiego modelu od zera (przy użyciu tf.initialize_variables()) w tym samym procesie.Wiele sesji i wykresów w Tensorflow (w tym samym procesie)

Istnieje znaczna ilość kodu i abstrakcji, dlatego właśnie wklejam odpowiednie sekcje tutaj.

Poniżej znajduje się kod przywracania:

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)) 

Każdy model jest objęty zakresem ramach własnego wykresu i sesji tak:

self.graph = tf.Graph() 
self.sess = tf.Session(graph=self.graph) 

with self.sess.graph.as_default(): 
    # Create variables and ops. 

Wszystkie zmienne w obrębie każdego modelu są tworzone w variable_scope Menedżer kontekstu.

Karmienie działa następująco:

  • Wątek tła nazywa sess.run(inference_op) na input = scipy.misc.imread(X) i umieszcza wynik w kolejce wątku bezpieczny blokującym.
  • Główna pętla treningowa odczytuje z kolejki i wywołuje sess.run(train_op) w drugim modelu.

PROBLEM:
Ja obserwując, że wartości strat, nawet w pierwszej iteracji szkoleniowej (drugiego modelu) ciągle się zmienia drastycznie całej trasy (i stać nan w ciągu kilku iteracji). Potwierdziłem, że wynik pierwszego modelu jest dokładnie taki sam za każdym razem. Komentowanie numeru sess.run pierwszego modelu i zastąpienie go identycznym wejściem z pliku piklowanego nie pokazuje takiego zachowania.

To 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 

wiem, że to jest niejasne, ale jestem szczęśliwy, aby podać więcej szczegółów. Każda pomoc jest doceniana!

Odpowiedz

1

Problem z pewnością dzieje się z powodu jednoczesnego wykonywania różnych obiektów sesji. Przesunąłem sesję pierwszego modelu z wątku tła do głównego wątku, kilkakrotnie powtórzyłem kontrolowany eksperyment (trwający ponad 24 godziny i osiągając zbieżność) i nigdy nie zaobserwowałem NaN. Z drugiej strony jednoczesne wykonywanie rozbiega model w ciągu kilku minut.

Dokonałem restrukturyzacji mojego kodu, aby użyć wspólnego obiektu sesji dla wszystkich modeli.

+0

Mam dokładnie ten sam problem. Czy możesz rozwinąć swoje rozwiązanie? –

+1

Nie uruchamiaj jednocześnie 'sess.run'. Tensorflow przejmuje pełną kontrolę nad (wszystkimi eksponowanymi) pamięciami GPU. Uruchamianie 'sess.run' w dwóch różnych procesach lub wątkach jednocześnie powoduje problemy. – Vikesh