Múltiples sesiones y gráficas en Tensorflow (en el mismo proceso)

Estoy entrenando un modelo donde el vector de entrada es la salida de otro modelo. Esto implica restaurar el primer modelo desde un archivo de punto de control mientras se inicializa el segundo modelo desde cero (usando tf.initialize_variables() ) en el mismo proceso.

Hay una cantidad sustancial de código y abstracción, así que simplemente estoy pegando las secciones relevantes aquí.

El siguiente es el código de restauración:

 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_restre: self.saver.restre(self.sess, save_path) else: self.sess.run(tf.initialize_variables(self.variables)) 

Cada modelo está dentro de su propio gráfico y sesión, como este:

  self.graph = tf.Graph() self.sess = tf.Session(graph=self.graph) with self.sess.graph.as_default(): # Create variables and ops. 

Todas las variables dentro de cada modelo se crean dentro del administrador de contexto variable_scope .

La alimentación funciona de la siguiente manera:

  • Un hilo de fondo llama a sess.run(inference_op) en input = scipy.misc.imread(X) y coloca el resultado en una cola de locking segura de subprocesos.
  • El ciclo principal de entrenamiento lee de la cola y llama a sess.run(train_op) en el segundo modelo.

PROBLEMA:
Estoy observando que los valores de pérdida, incluso en la primera iteración del entrenamiento (segundo modelo) siguen cambiando drásticamente a través de las carreras (y se convierten en nan en algunas iteraciones). Confirmé que la salida del primer modelo es exactamente la misma cada vez. Comentando el sess.run del primer modelo y reemplazándolo con una entrada idéntica de un archivo encurtido no muestra este comportamiento.

Este es el 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 

Sé que esto es vago, pero me complace proporcionar más detalles. Cualquier ayuda es apreciada!

El problema está ocurriendo sin duda debido a la ejecución concurrente de diferentes objetos de sesión. Pasé la sesión del primer modelo del hilo de fondo al hilo principal, repetí el experimento controlado varias veces (durante más de 24 horas y alcanzando la convergencia) y nunca observé NaN . Por otro lado, la ejecución concurrente diverge del modelo en unos pocos minutos.

He reestructurado mi código para usar un objeto de sesión común para todos los modelos.