[英]What is the difference between np.mean and tf.reduce_mean?
在MNIST初學者教程中,有這樣的聲明
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
:要減少的張量。 應該有數字類型。
reduction_indices
:要減少的維度。 如果None
(默認值),則減少所有維度。# '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)
發生了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 操作。 但是為了進行 tensorflow 操作,必須在 tensorflow Session
內完成。 您可以在此處閱讀更多相關信息。 因此,當您需要對 tensorflow 圖(或結構,如果您願意)執行任何計算時,它必須在 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
中將 mean 增加1
,但是為了在 tensorflow 中執行此操作,您需要在Session
執行該操作,而不使用Session
則無法執行此操作。 換句話說,當您計算tfMean = tf.reduce_mean(c)
,tensorflow 不會計算它。 它只在Session
計算。 但是 numpy 會在您編寫np.mean()
時立即計算。
我希望這是有道理的。
這里的關鍵是reduce這個詞,它是函數式編程的一個概念,它使得TensorFlow中的reduce_mean
可以保持一批輸入計算結果的運行平均值。
如果您不熟悉函數式編程,這可能看起來很神秘。 所以首先讓我們看看reduce
是做什么的。 如果你得到一個像 [1,2,5,4] 這樣的列表,並被告知計算平均值,那很容易——只需將整個數組傳遞給np.mean
可以得到平均值。 但是,如果您必須計算數字流的平均值怎么辦? 在這種情況下,您必須首先通過從流中讀取來組裝數組,然后對結果數組調用np.mean
- 您將不得不編寫更多代碼。
另一種方法是使用reduce 范式。 舉個例子,看看我們如何在 python 中使用 reduce 來計算數字的總和: reduce(lambda x,y: x+y, [1,2,5,4])
。
它是這樣工作的:
在此處閱讀更多Python 函數式編程
要了解這如何應用於 TensorFlow,請查看以下代碼塊,該代碼塊定義了一個簡單的圖形,它接收一個浮點數並計算平均值。 然而,圖形的輸入不是單個浮點數,而是浮點數數組。 reduce_mean
計算所有這些浮點數的平均值。
import tensorflow as tf
inp = tf.placeholder(tf.float32)
mean = tf.reduce_mean(inp)
x = [1,2,3,4,5]
with tf.Session() as sess:
print(mean.eval(feed_dict={inp : x}))
當計算批量圖像的值時,這種模式會派上用場。 看看Deep MNIST 示例,你會看到如下代碼:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
新文檔指出tf.reduce_mean()
產生與 np.mean 相同的結果:
相當於 np.mean
它還具有與np.mean完全相同的參數。 但這里有一個重要的區別:它們僅在浮點值上產生相同的結果:
import tensorflow as tf
import numpy as np
from random import randint
num_dims = 10
rand_dim = randint(0, num_dims - 1)
c = np.random.randint(50, size=tuple([5] * num_dims)).astype(float)
with tf.Session() as sess:
r1 = sess.run(tf.reduce_mean(c, rand_dim))
r2 = np.mean(c, rand_dim)
is_equal = np.array_equal(r1, r2)
print is_equal
if not is_equal:
print r1
print r2
如果去掉類型轉換,會看到不同的結果
除此之外,許多其他tf.reduce_
函數如reduce_all
、 reduce_any
、 reduce_min
、 reduce_max
、 reduce_prod
產生與 numpy 類似物相同的值。 顯然,因為它們是操作,所以它們只能從會話內部執行。
1
通常指行,而2
通常指列。 減少“超過”索引1
意味着減少 rowwise。
[1., 2.]
就是[ <row 1 mean> , <row 2 mean> ]
。
這種索引編號約定在統計軟件中很典型,尤其是 R。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.