np.mean和tf.reduce_mean有什么区别?


90

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)


由于python中的除法,它们在整数值上产生不同的结果
Salvador Dali'5

对于tensorflow而言,新特性的一个重要区别是:tf.reduce_mean多线程,通常在GPU np.mean上计算,而在单个CPU上计算。此外,它还tf被设计为处理一批数据,同时np作用于单个数据实例。
drevicko

Answers:


110

的功能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操作。但是为了进行张量流操作,必须在张量流内部进行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)

我们可以像平常那样增加1in的均值numpy,但是要在tensorflow中进行均值化,您需要在中执行Session,而无需使用Session您不能这样做。换句话说,当您在计算时tfMean = tf.reduce_mean(c),tensorflow不会对其进行计算。它仅在中计算Session。但是,当您编写时,numpy会立即进行计算np.mean()

我希望这是有道理的。


21
但是在这里减少零件意味着什么?
rsht

20
@Roman是函数编程中的一个术语。:你可以在这里读到它python-course.eu/lambda.php
Daniyar

1
@rsht REDUCE =通过将数字相加为1来减少数字。MEAN =求和的平均值。
Meghna Natraj '19

1
@rsht假设您有N个元素,并且想要计算这N个数字的平均值(M)。解决此问题的一种方法是,我们有一个大小为(1,N)的向量,并且在轴= 0上,我们减少了元素(这里有N个元素)。约简(或聚合)具有某种功能,在我们的示例中,该函数是均值函数。
提起

22

这里的关键是来自函数编程的一个概念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的结果,表示减少了存储)。减少存储结果8。
  3. 步骤3:从列表中读取下一个数字-4.评估lambda 8,4(8是步骤2的结果,减少了存储的值)。减少存储结果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}))

当计算成批图像的值时,此模式非常有用。查看The Deep MNIST Example,在该示例中您将看到如下代码:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

3

新文档说明tf.reduce_mean()产生的结果与np.mean相同:

相当于np.mean

它也具有与np.mean绝对相同的参数。但这是一个重要的区别:它们仅在float值上产生相同的结果:

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的类似物。显然,由于它们是操作,因此只能在会话内部执行。


除了示例之外,如果您解释了区别是什么可能会有所帮助。通过运行示例,我得到的印象是tf.reduce_mean确保输出dtype与input匹配dtype。的输出np.mean()始终是浮点数。那是对的吗?
craq

-1

1通常指行,2通常指列。减少“过度”索引1意味着减少按行。

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

此索引编号约定在统计软件(尤其是R)中很常见。


1
我相信0是指专栏,而不是2
hfz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.