Plusieurs sessions et des graphiques dans Tensorflow (dans le même processus)

Je suis la formation d'un modèle où le vecteur d'entrée est la sortie d'un autre modèle. Cela implique la restauration le premier modèle à partir d'un fichier de point de contrôle lors de l'initialisation du deuxième modèle à partir de zéro (à l'aide de tf.initialize_variables()) dans le même processus.

Il y a une quantité importante de code et de l'abstraction, donc je vais juste coller les sections pertinentes ici.

Ce qui suit est la restauration de code:

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

Chaque modèle est étendue à l'intérieur de son propre graphique et de la session, comme ceci:

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

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

Toutes les variables au sein de chaque modèle sont créés au sein de la variable_scope gestionnaire de contexte.

L'alimentation fonctionne comme suit:

  • Un thread d'arrière-plan des appels sess.run(inference_op) sur input = scipy.misc.imread(X) et met le résultat dans un blocage thread-safe file d'attente.
  • La principale formation de la boucle de lit à partir de la file d'attente et les appels sess.run(train_op) sur le second modèle.

PROBLÈME:

J'observe que la perte de valeurs, même dans la première itération de la formation (deuxième modèle) ne cessent de changer considérablement dans toute fonctionne (et devenir nan en quelques itérations). J'ai confirmé que la sortie du premier modèle est exactement le même à chaque fois. Commentant la sess.run du premier modèle et de le remplacer à l'identique d'entrée à partir d'un marinés fichier ne montrent pas ce comportement.

C'est le 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

Je sais que c'est vague, mais je suis heureux de vous fournir plus de détails. Toute aide est appréciée!

InformationsquelleAutor Vikesh | 2016-08-07