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)
nainput = 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!
Mam dokładnie ten sam problem. Czy możesz rozwinąć swoje rozwiązanie? –
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