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

时间:2015-12-12 00:21:08

标签: python numpy machine-learning mean tensorflow

MNIST beginner tutorial中,有声明

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(defaut),则减少所有维度。

# '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.]

对于1D向量,它看起来像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)会发生什么?

4 个答案:

答案 0 :(得分:90)

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内完成。您可以阅读更多相关信息here。因此,当您需要对张量流图(或结构,如果愿意)执行任何计算时,必须在张量流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)

我们可以按1 numpy增加平均值,但是为了在tensorflow中执行此操作,您需要在Session中执行该操作,而不使用{{1}你无法做到这一点。换句话说,当您计算Session时,张量流不会计算它。它只计算tfMean = tf.reduce_mean(c)中的值。但是当你写Session时,numpy会立即计算出来。

我希望这是有道理的。

答案 1 :(得分:12)

这里的关键词是reduce,这是一个来自函数式编程的概念,它使得TensorFlow中的reduce_mean可以保持一批输入的计算结果的运行平均值。

如果您不熟悉函数式编程,这看起来很神秘。首先让我们看看减少的作用。如果给你一个像[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。减少存储结果3.注意 - 这是从列表中读取2位数的唯一步骤
  2. 步骤2:从列表中读取下一个数字 - 5.评估lambda 5,3(3是步骤1的结果,减少存储的数量)。减少存储结果8.
  3. 步骤3:从列表中读取下一个数字 - 4.评估lambda 8,4(8是步骤2的结果,减少存储)。减少存储结果12
  4. 步骤4:从列表中读取下一个数字 - 没有,所以返回存储的结果为12。
  5. 在此处阅读更多Functional Programming in 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))
    

答案 2 :(得分:1)

新文档指出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也会产生相同的功能价值观就像那些笨拙的类比。显然,因为它们是操作,它们只能从会话内部执行。

答案 3 :(得分:-1)

1通常是指行,而2通常是指列。减少" over" index 1表示逐行减少。

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

这种索引编号惯例在stats软件中很常见,尤其是R。