在MNIST beginner tutorial中,有accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
基本上改變了對象的張量類型,那麽tf.reduce_mean
和np.mean
有什麽不同?
這是tf.reduce_mean
上的文檔:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
input_tensor: The tensor to reduce. Should have numeric type.
reduction_indices: The dimensions to reduce. If `None` (the defaut),
reduces all dimensions.
# 'x' is [[1., 1. ]]
# [2., 2.]]
tf.reduce_mean(x) ==> 1.5
tf.reduce_mean(x, 0) ==> [1.5, 1.5]
tf.reduce_mean(x, 1) ==> [1., 2.]
對於一維矢量,它看起來像np.mean == tf.reduce_mean
,但我不明白tf.reduce_mean(x, 1) ==> [1., 2.]
中發生了什麽。 tf.reduce_mean(x, 0) ==> [1.5, 1.5]
類型是有道理的,因為[1,2]和[1,2]的平均值是[1.5,1.5],但是tf.reduce_mean(x,1)
是怎麽回事?
最佳解決方法
numpy.mean
和tensorflow.reduce_mean
的功能是一樣的。他們做同樣的事情。從文檔numpy和tensorflow,你可以看到。讓我們通過一個例子來了解,
c = np.array([[3.,4], [5.,6], [6.,7]])
print(np.mean(c,1))
Mean = tf.reduce_mean(c,1)
with tf.Session() as sess:
result = sess.run(Mean)
print(result)
輸出
[ 3.5 5.5 6.5]
[ 3.5 5.5 6.5]
在這裏你可以看到,當axis
(numpy)或者reduction_indices
(tensorflow)是1時,它計算了(3,4)和(5,6)和(6,7)中的平均值,所以1
定義在哪個軸上計算平均值。當它是0時,通過(3,5,6)和(4,6,7)計算均值,依此類推。
現在他們之間有什麽區別?
你可以在python的任何地方計算numpy操作。但是為了進行張量運算,必須在TensorflowSession
內完成。你可以在這裏閱讀更多資料。也就是說,當你需要對張量流Tensorflow圖進行任何計算(或者如果你願意的話)時,必須在張量流Session
內完成。
讓我們再看另一個例子。
npMean = np.mean(c)
print(npMean+1)
tfMean = tf.reduce_mean(c)
Add = tfMean + 1
with tf.Session() as sess:
result = sess.run(Add)
print(result)
我們可以自然地在numpy中增加1,但是為了在tensorflow中做同樣的事情,需要在Session中執行,而不使用Session,無法這樣做。換句話說,當你計算tfMean = tf.reduce_mean(c)時,tensorflow不會計算它。它隻在會話中計算。但是當你寫np.mean()時,numpy立即計算出來。