Várias sessões e gráficos no Tensorflow (no mesmo processo)

Estou treinando um modelo em que o vetor de entrada é a saída de outro modelo. Isso envolve restaurar o primeiro modelo de um arquivo de ponto de verificação e inicializar o segundo modelo do zero (usandotf.initialize_variables()) no mesmo processo.

Há uma quantidade substancial de código e abstração, então estou apenas colando as seções relevantes aqui.

A seguir está o código de restauração:

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

Cada modelo tem um escopo definido dentro de seu próprio gráfico e sessão, assim:

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

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

Todas as variáveis em cada modelo são criadas dentro dovariable_scope gerenciador de contexto.

A alimentação funciona da seguinte maneira:

Um thread em segundo plano chamasess.run(inference_op) eminput = scipy.misc.imread(X) e coloca o resultado em uma fila de bloqueio de thread-safe.O loop de treinamento principal lê da fila e chamasess.run(train_op) no segundo modelo.

PROBLEMA:
Estou observando que os valores de perda, mesmo na primeira iteração do treinamento (segundo modelo), continuam mudando drasticamente entre as corridas (e se tornam nan em algumas iterações). Confirmei que a saída do primeiro modelo é exatamente a mesma sempre. Comentando osess.run do primeiro modelo e substituí-lo por entrada idêntica de um arquivo em conserva não mostra esse comportamento.

Isto é otrain_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

Sei que isso é vago, mas estou feliz em fornecer mais detalhes. Qualquer ajuda é apreciada!

questionAnswers(1)

yourAnswerToTheQuestion