2017-06-09 69 views
0

我想在這個page上tensorflow的入門示例。我想打印一下cross_entropy,但什麼也沒有。 這裏是代碼,它也可以從here引用。tensorflow,如何做tf.Print在mnist爲ml初學者

from tensorflow.examples.tutorials.mnist import input_data 
import tensorflow as tf 
import numpy as np 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 

x = tf.placeholder(tf.float32, [None, 784]) 
y_ = tf.placeholder(tf.float32, [None, 10]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 

y = tf.matmul(x, W) + b 
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)) 
cross_entropy = tf.Print(cross_entropy, [cross_entropy], "###") 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

sess = tf.InteractiveSession() 
tf.global_variables_initializer().run() 
for _ in range(1000): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) 

我無法找出原因tf.Print,這勢必會cross_entropy,印刷沒有在每個循環。

我想我已經綁定了tf.Print - > cross_entropy - > train_step並運行這個train_step。我的問題是什麼?

回答

0

你是對的,tf.Print的(引用文檔):

的身份與運算時評估打印數據的副作用。

因此,您希望每當有東西流經cross_entropy節點時,您都​​會看到cross_entropy的值。

問題是,你正在最小化真正的交叉熵而不是身份節點。因此,在實踐中,cross_entropy變量是一個「指向」另一個變量的身份節點,該變量得到有效評估。

要解決這個問題,您可以強制圖中節點的評估順序。

您可以限制僅在記錄該值後執行的最小化步驟。要做到這一點,你可以以這種方式使用tf.control_dependencies

from tensorflow.examples.tutorials.mnist import input_data 
import tensorflow as tf 
import numpy as np 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 

x = tf.placeholder(tf.float32, [None, 784]) 
y_ = tf.placeholder(tf.float32, [None, 10]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 

y = tf.matmul(x, W) + b 
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)) 

with tf.control_dependencies([tf.Print(cross_entropy, [cross_entropy], "###")]): 
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

sess = tf.InteractiveSession() 
tf.global_variables_initializer().run() 
for _ in range(1000): 
    batch_xs, batch_ys = mnist.train.next_batch(100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
print(
    sess.run(accuracy, feed_dict={x: mnist.test.images, 
            y_: mnist.test.labels})) 
+0

所以原因是tensorflow評估過程沒有正確由於錯誤的變量綁定執行? –

+0

我並不完全確定評估執行不正確。我建議你在GitHub上打開一個鏈接這個線程的問題:也許TF開發人員可以理解並向我們解釋爲什麼沒有'tf.control_dependencies'' tf.Print'不起作用。我的猜測是'cross_entropy'成爲一個參考節點,而不是一個真正的節點,因此沒有任何東西流入參考,但這只是我對tensorflow如何工作的理解。打開這個問題,然後在這裏鏈接,我也很感興趣(也許這是一個錯誤!)。 – nessuno