2017-06-01 5 views
2

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!

+0

Essayez 'avec tf.Session (graph = g) comme sess:' et assurez-vous d'envoyer le graphique de droite à la session – bluesummers

+0

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. –

+0

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

Répondre

1

Résolu. Erreur stupide test_once appelle deux fois sess.run. Sur la deuxième fois, en effet aucun espace réservé n'est alimenté ....: summary.ParseFromString (sess.run (summary_op))