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)
surinput = 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!
Vous devez vous connecter pour publier un commentaire.
La question est très certainement se passe en raison d'une exécution simultanée de différents objets de session. J'ai déplacé le premier modèle de la session de la thread d'arrière-plan pour le thread principal, a répété l'expérience contrôlée plusieurs fois (en cours d'exécution pour plus de 24 heures et de convergence) et jamais observé
NaN
. D'autre part, une exécution simultanée diverge du modèle dans un délai de quelques minutes.J'ai restructuré mon code pour utiliser un commun objet de session pour tous les modèles.
sess.run
simultanément. Tensorflow assume le contrôle complet de tous les exposés) mémoire GPU. L'exécution desess.run
dans deux différents processus ou threads simultanément l'origine de problèmes.