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!