簡體   English   中英

np.mean 和 tf.reduce_mean 有什么區別?

[英]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_meannp.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.meantensorflow.reduce_mean的功能是相同的。 他們做同樣的事情。 從文檔中,對於numpytensorflow ,您可以看到這一點。 讓我們看一個例子,

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])

它是這樣工作的:

  1. 第 1 步:從列表中讀取 2 位數字 - 1,2。 評估 lambda 1,2。 reduce 存儲結果 3. 注意 - 這是從列表中讀取 2 位數字的唯一步驟
  2. 第 2 步:從列表中讀取下一個數字 - 5. 評估 lambda 5、3(3 是第 1 步的結果,reduce 存儲)。 reduce 存儲結果 8.
  3. 第 3 步:從列表中讀取下一個數字 - 4. 評估 lambda 8,4(8 是第 2 步的結果,即減少存儲)。 reduce 存儲結果 12
  4. 第 4 步:從列表中讀取下一個數字 - 沒有,因此返回 12 的存儲結果。

在此處閱讀更多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_allreduce_anyreduce_minreduce_maxreduce_prod產生與 numpy 類似物相同的值。 顯然,因為它們是操作,所以它們只能從會話內部執行。

1通常指行,而2通常指列。 減少“超過”索引1意味着減少 rowwise。

[1., 2.]就是[ <row 1 mean> , <row 2 mean> ]

這種索引編號約定在統計軟件中很典型,尤其是 R。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM