Ma question concerne le contexte et les sessions et le graphique par défaut de TensorFlow.Tensorflow session et contexte de graphique
Le problème: tensorflow est incapable de nourrir un espace réservé dans le scénario suivant: Fonction Test
définit un graphique. La fonction Test_Once
définit une session. Lorsque la fonction Test
appelle Test_Once
-> L'alimentation échoue. Lorsque je change le code, la fonction Test
déclare le graphique + la session -> tout fonctionne.
Voici le code:
def test_once(g, saver, summary_writer, logits, images, summary_op):
"""Run a session once for a givven test image.
Args:
saver: Saver.
summary_writer: Summary writer.
logits:
summary_op: Summary op.
"""
with tf.Session(graph=g) as sess:
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
if ckpt and ckpt.model_checkpoint_path:
# Restores from checkpoint
saver.restore(sess, ckpt.model_checkpoint_path)
# extract global_step from it.
global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
else:
print('No checkpoint file found')
return
images.astype(np.float32)
predictions = sess.run(logits, feed_dict={'InputPlaceHolder/TestInput:0':images})
summary = tf.Summary()
summary.ParseFromString(sess.run(summary_op))
summary_writer.add_summary(summary, global_step)
return (predictions)
def test():
"""Test LCPR with a test image"""
with tf.Graph().as_default() as g:
# Get image for testing
images, labels = lcpr.test_input()
# Build a Graph that computes the logits predictions from the
# inference model.
with tf.name_scope('InputPlaceHolder'):
test_image_placeholder = tf.placeholder(tf.float32, (None,None,None,3), 'TestInput')
# Display the training images in the visualizer.
# The 'max_outputs' default is 3. Not stated. (Max number of batch elements to generate images for.)
#tf.summary.image('input_images', test_image_placeholder)
with tf.name_scope('Inference'):
logits = lcpr.inference(test_image_placeholder)
# Restore the moving average version of the learned variables for eval.
variable_averages = tf.train.ExponentialMovingAverage(
lcpr.MOVING_AVERAGE_DECAY)
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)
# Build the summary operation based on the TF collection of Summaries.
writer = tf.summary.FileWriter("/tmp/lcpr/test")
writer.add_graph(g)
summary_op = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(FLAGS.test_dir, g)
#Sadly, this will not work:
predictions = test_once(g, saver, summary_writer, logits, images, summary_op)
'''Alternative working option :
with tf.Session() as sess:
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
if ckpt and ckpt.model_checkpoint_path:
# Restores from checkpoint
saver.restore(sess, ckpt.model_checkpoint_path)
# Assuming model_checkpoint_path looks something like:
# /my-favorite-path/cifar10_train/model.ckpt-0,
# extract global_step from it.
global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
else:
print('No checkpoint file found')
return
x = sess.run(logits, feed_dict={'InputPlaceHolder/TestInput:0':images})
print(x)
'''
Le code ci-dessus yeilds une erreur que l'espace réservé n'est pas alimenté:
InvalidArgumentError (voir ci-dessus retraçage): Vous devez nourrir une valeur pour tenseur d'espace réservé 'InputPlaceHolder/TestInput' avec dtype float
Et ce n'est pas que TensorFlow ne reconnaît pas l'espace réservé. Si je change le nom de 'InputPlaceHolder/TestInput: 0' en 'InputPlaceHolder/TestInput: 1' Je reçois un message apaisant que 'InputPlaceHolder/TestInput' existe mais a seulement 1 sortie. Cela a du sens, et je suppose que la session s'exécute sur mon graphique par défaut.
Les choses ne fonctionnent que pour moi si je reste dans le même def: Si je change le code en exécutant la partie commentée (en commençant 'avec tf.Session() comme sess :) directement à partir de la première fonction tout travaux.
Je me demande ce qui me manque? Ma conjecture est liée au contexte, peut-être ne pas affecter la session au graphique? Merci de votre aide!
Essayez 'avec tf.Session (graph = g) comme sess:' et assurez-vous d'envoyer le graphique de droite à la session – bluesummers
Merci d'avoir répondu! J'ai effectivement essayé et cela n'a pas résolu le problème. Aussi essayé d'obtenir le graphique par défaut tf et l'utiliser, mais pas de chance. Quelque chose est perdu pour moi lors de l'exécution de la session de la fonction externe. –
Cela semble peu probable, vous devez retourner 'g' à partir de la fonction' test', puis envoyer la valeur renvoyée à la fonction 'test_once'. S'il vous plaît essayer et de répondre – bluesummers