2016-07-07 24 views
5

Ho un bug che non riesco a trovare il motivo. Ecco il codice:Tensorflow: feed dt errore: È necessario alimentare un valore per tensore segnaposto

with tf.Graph().as_default(): 
     global_step = tf.Variable(0, trainable=False) 

     images = tf.placeholder(tf.float32, shape = [FLAGS.batch_size,33,33,1]) 
     labels = tf.placeholder(tf.float32, shape = [FLAGS.batch_size,21,21,1]) 

     logits = inference(images) 
     losses = loss(logits, labels) 
     train_op = train(losses, global_step) 
     saver = tf.train.Saver(tf.all_variables()) 
     summary_op = tf.merge_all_summaries() 
     init = tf.initialize_all_variables() 

     sess = tf.Session() 
     sess.run(init)             

     summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph) 

     for step in xrange(FLAGS.max_steps): 
      start_time = time.time() 

      data_batch, label_batch = SRCNN_inputs.next_batch(np_data, np_label, 
                   FLAGS.batch_size) 


      _, loss_value = sess.run([train_op, losses], feed_dict={images: data_batch, labels: label_batch}) 

      duration = time.time() - start_time 

def next_batch(np_data, np_label, batchsize, 
       training_number = NUM_EXAMPLES_PER_EPOCH_TRAIN): 

    perm = np.arange(training_number) 
    np.random.shuffle(perm) 
    data = np_data[perm] 
    label = np_label[perm] 
    data_batch = data[0:batchsize,:] 
    label_batch = label[0:batchsize,:] 


return data_batch, label_batch 

dove np_data è l'intera campioni di training leggere dal file HDF5, e lo stesso per np_label.

Dopo aver eseguito il codice, ho avuto l'errore come questo:

2016-07-07 11:16:36.900831: step 0, loss = 55.22 (218.9 examples/sec; 0.585 sec/batch) 
Traceback (most recent call last): 

    File "<ipython-input-1-19672e1f8f12>", line 1, in <module> 
    runfile('/home/kang/Documents/work_code_PC1/tf_SRCNN/SRCNN_train.py', wdir='/home/kang/Documents/work_code_PC1/tf_SRCNN') 

    File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 685, in runfile 
    execfile(filename, namespace) 

    File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 85, in execfile 
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "/home/kang/Documents/work_code_PC1/tf_SRCNN/SRCNN_train.py", line 155, in <module> 
    train_test() 

    File "/home/kang/Documents/work_code_PC1/tf_SRCNN/SRCNN_train.py", line 146, in train_test 
    summary_str = sess.run(summary_op) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 372, in run 
    run_metadata_ptr) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 636, in _run 
    feed_dict_string, options, run_metadata) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 708, in _do_run 
    target_list, options, run_metadata) 

    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 728, in _do_call 
    raise type(e)(node_def, op, message) 

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [128,33,33,1] 
    [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[128,33,33,1], _device="/job:localhost/replica:0/task:0/gpu:0"]()]] 
    [[Node: truediv/_74 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_56_truediv", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 
Caused by op 'Placeholder', defined at: 

Quindi, mostra che per il passo 0 ha il risultato, il che significa che i dati sono stati inseriti in dei segnaposto.

Ma perché arriva l'errore di inserire i dati in Segnaposto nella prossima volta?

Quando provo a commentare il codice summary_op = tf.merge_all_summaries() e il codice funziona correttamente. perché è così?

risposta

9

When I try to comment the code summary_op = tf.merge_all_summaries() and the code works fine. why is it the case?

summary_op è un'operazione. Se esiste (e questo è vero nel tuo caso) un'operazione di riepilogo relativa al risultato di un'altra operazione che dipende dai valori dei segnaposto, devi fornire al grafico i valori richiesti.

Pertanto, la riga summary_str = sess.run(summary_op) richiede il dizionario dei valori da memorizzare.

In genere, invece di rieseguire le operazioni per registrare i valori, si eseguono le operazioni e il summary_op una volta.

fare qualcosa di simile

if step % LOGGING_TIME_STEP == 0: 
    _, loss_value, summary_str = sess.run([train_op, losses, summary_op], feed_dict={images: data_batch, labels: label_batch}) 
else: 
    _, loss_value = sess.run([train_op, losses], feed_dict={images: data_batch, labels: label_batch}) 
+1

Grazie mille. Funziona. –

+0

Ho trovato questo utile in generale per apprezzare come posso eseguire diverse operazioni sul grafico per ottenere i dati (di registrazione o di riepilogo) laddove appropriato. Dimostra la flessibilità della TF, una volta che "ottieni" come sono fatte le cose. Saluti! –

+0

Prego! – nessuno

Problemi correlati