np.mean和tf.reduce_mean有什么区别?
machine-learning
numpy
python
tensorflow
9
0

MNIST初学者教程中 ,有一条声明

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.cast基本上改变了对象的张量类型,但是tf.reduce_meannp.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, 2]均值为[1, 2] tf.reduce_mean(x, 1) [1.5, 1.5] ,但是tf.reduce_mean(x, 1)发生了tf.reduce_mean(x, 1)

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

这里的关键是来自函数编程的概念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(步骤2的结果为8,即减少了存储的值)。减少存储结果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))
收藏
评论

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

收藏
评论

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)

我们可以自然地将numpy均值增加1 ,但是要在tensorflow中做到这一点,您需要在Session执行该操作,而无需使用Session您将无法做到这一点。换句话说,当您计算tfMean = tf.reduce_mean(c) ,tensorflow不会对其进行计算。它仅在Session计算。但是,当您编写np.mean()时,numpy会立即进行计算。

我希望这是有道理的。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题