2017-02-09 3 views
0

Я пытаюсь использовать eval(), чтобы понять, что происходит на каждом этапе обучения.Ошибка Tensorflow - eval(): вы должны подать значение для тензора заполнителя

Однако, если я использую eval() для операции tf.matmul, тогда я бы получил ошибку You must feed a value for placeholder tensor.

Если я удалю eval(), тогда все будет работать должным образом, как ожидалось.

num_steps = 3001 

with tf.Session(graph=graph) as session: 
    tf.global_variables_initializer().run() 
    writer = tf.summary.FileWriter("/home/ubuntu/tensorboard", graph=tf.get_default_graph()) 
    for step in range(num_steps): 
     offset = (step * batch_size) % (train_labels.shape[0] - batch_size) 
     batch_data = train_dataset[offset:(offset + batch_size), :] 
     batch_labels = train_labels[offset:(offset + batch_size), :] 
     feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels} 
     _, l, predictions, summary = session.run([optimizer, loss, train_prediction, summary_op], feed_dict=feed_dict) 
     writer.add_summary(summary, step) 

     # If I removed this line, then it would work 
     loss.eval() 

batch_size = 128 

graph = tf.Graph() 
with graph.as_default(): 
    with tf.name_scope('tf_train_dataset'): 
     tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size)) 
    with tf.name_scope('tf_train_labels'): 
     tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
    with tf.name_scope('tf_valid_dataset'): 
     tf_valid_dataset = tf.constant(valid_dataset) 
    with tf.name_scope('tf_test_dataset'): 
     tf_test_dataset = tf.constant(test_dataset) 

    with tf.name_scope('weights'): 
     weights = tf.Variable(tf.truncated_normal([image_size * image_size, num_labels])) 
    with tf.name_scope('biases'): 
     biases = tf.Variable(tf.zeros([num_labels])) 

    with tf.name_scope('logits'): 
     logits = tf.matmul(tf_train_dataset, weights) + biases 
    with tf.name_scope('loss'): 
     loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels)) 
     tf.summary.scalar("loss", loss) 

    with tf.name_scope('optimizer'): 
     optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

    with tf.name_scope("train_prediction"): 
     train_prediction = tf.nn.softmax(logits) 
    with tf.name_scope("valid_prediction"): 
     valid_prediction = tf.nn.softmax(tf.matmul(tf_valid_dataset, weights) + biases) 
    with tf.name_scope("test_prediction"): 
     test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases) 

    with tf.name_scope("correct_prediction"): 
     correct_prediction = tf.equal(tf.argmax(tf_train_labels,1), tf.argmax(train_prediction,1)) 

    with tf.name_scope("accuracy"): 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
     tf.summary.scalar("training_accuracy", accuracy) 

    summary_op = tf.summary.merge_all() 

Точная ошибка:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'tf_train_dataset/Placeholder' with dtype float and shape [128,784] 
    [[Node: tf_train_dataset/Placeholder = Placeholder[dtype=DT_FLOAT, shape=[128,784], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

Кто-нибудь есть лучший способ, чтобы войти переменные? Я пробовал tensor_summary, но он не показывает его на веб-сайте.

Спасибо всем

+0

Если вы просто хотите, чтобы напечатать значение Тензор во время выполнения графика, вы можете прикрепить 'tf.Print' узел к графику ([документация] (https://www.tensorflow.org/api_docs/python/control_flow_ops/debugging_operations#Print)). Просто убедитесь, что вы используете вывод операции «Печать» на вашем графике ([пример] (http://stackoverflow.com/questions/33633370/how-to-print-the-value-of-a-tensor-object -в-tensorflow/36296783 # 36296783)). –

+0

@AllenLavoie tf.Print печатает на консоль, а не на iPython ноутбук, любой способ изменить это? Спасибо – user1157751

+0

'tf.InteractiveSession()' (а не 'tf.Session()') исправляет это для меня. –

ответ

1

Помимо комментария AllenLavoie, вы можете на самом деле кормить словарь через Eval.

loss.eval(feed_dict=feed_dict) 

Причудливый API TensorFlow не знает, что я уже заранее заправил словарь.

Следовательно: _, l, predictions, summary = session.run([optimizer, loss, train_prediction, summary_op], feed_dict=feed_dict)

не работает, даже если он помещен перед темloss.eval()

Смежные вопросы

 Смежные вопросы