Numpy和Tensorflow中np.mean和tf.reduce_mean的区别?

O.r*_*rka 79 python numpy machine-learning mean tensorflow

MNIST初学者教程中,有tf.cast

tf.reduce_mean基本上改变了对象的张量类型,但是np.meantf.reduce_mean?之间有什么区别?

这是关于以下内容的文档reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None):

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
Run Code Online (Sandbox Code Playgroud)

对于一维矢量,它看起来像input_tensor但我不明白发生了什么reduction_indices.None有道理,因为[1,2]和[1,2]的平均值是[1.5,1.5],但是发生了什么np.mean == tf.reduce_mean

Shu*_*his 100

功能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)
Run Code Online (Sandbox Code Playgroud)

产量

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到,当axis(numpy)或reduction_indices(tensorflow)为1时,它计算横跨(3,4)和(5,6)和(6,7)1的平均值,因此定义计算平均值的轴.当它为0时,平均值计算在(3,5,6)和(4,6,7)之间,依此类推.我希望你明白这个主意.

现在它们之间有什么区别?

你可以在python上的任何地方计算numpy操作.但是为了进行张量流操作,必须在张量流内完成Session.你可以在这里阅读更多相关信息.因此,当您需要对张量流图(或结构,如果愿意)执行任何计算时,必须在张量流内完成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)
Run Code Online (Sandbox Code Playgroud)

我们可以通过增加平均1numpy,你会自然地,但为了做到这一点在tensorflow,您需要执行,在Session不使用Session你不能这样做.换句话说,当您进行计算时tfMean = tf.reduce_mean(c),tensorflow不会计算它.它只计算一个Session.但是当你写作时,numpy会立即计算出来np.mean().

我希望这是有道理的.

  • @Roman它是函数式编程的术语.你可以在这里阅读:http://www.python-course.eu/lambda.php (20认同)
  • 但**减少**部分**意味着什么**? (18认同)
  • @rsht REDUCE=通过将数字相加为 1 来减少数字。MEAN=该总和的平均值。 (3认同)
  • @rsht 假设您有 N 个元素,并且您想要计算这 N 个数字的平均值 (M)。解决这个问题的一种方法是,我们有一个大小为 (1,N) 的向量,在轴=0 上,我们减少元素(这里有 N 个元素)。归约(或聚合)带有一个函数,在我们的示例中,该函数是均值函数。 (3认同)

Nik*_*rge 18

这里的关键是单词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.

阅读更多此处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}))
Run Code Online (Sandbox Code Playgroud)

在计算批量图像的值时,此模式非常有用.看看Deep MNIST示例,您可以在其中看到如下代码:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
Run Code Online (Sandbox Code Playgroud)


Sal*_*ali 5

新文档指出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
Run Code Online (Sandbox Code Playgroud)

如果去掉类型转换,会看到不同的结果


在附加到这一点,许多其他tf.reduce_的功能,例如reduce_allreduce_anyreduce_minreduce_maxreduce_prod产生相同的值作为有numpy的类似物。显然,因为它们是操作,所以它们只能从会话内部执行。