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

在MNIST初学者教程中 ,有accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.cast基本上改变了对象的张量types,但是tf.reduce_meannp.mean什么np.mean呢?

这里是关于tf.reduce_mean的文档:

 reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None) input_tensor: The tensor to reduce. Should have numeric type. reduction_indices: The dimensions to reduce. If `None` (the defaut), reduces all dimensions. # '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.] 

对于一维vector,它看起来像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)

numpy.meantensorflow.reduce_mean的function是一样的。 他们做同样的事情。 从文档中,对于numpy和tensorflow ,你可以看到。 让我们看一个例子,

 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操作。 但是为了做一个张量stream操作,它必须在一个张量streamSession内完成。 你可以在这里阅读更多。 所以当你需要对张量stream图进行任何计算(或者如果你愿意的话),它必须在张量streamSession

让我们看另一个例子。

 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立即计算出来。

我希望这是有道理的。

新的文档指出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 

如果您将删除types转换,您将看到不同的结果


除此之外,许多其他tf.reduce_函数(如reduce_allreduce_anyreduce_minreduce_maxreduce_prod产生与numpy reduce_prod的值。 显然,因为它们是操作,所以只能从会话内部执行。

1通常是指行,而2通常是指列。 减less“超过”索引1意味着减less行方向。

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

这个索引编号约定在统计软件中是很典型的,尤其是R

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

如果你不熟悉函数式编程,这可能看起来很神秘。 所以首先让我们看看减less了什么。 如果给出一个像[1,2,5,4]这样的列表,并被告知要计算平均值,那么很简单 – 只需将整个数组传递给np.mean即可。 但是,如果你必须计算一串数字的平均值呢? 在这种情况下,你必须首先通过从stream中读取来组装数组,然后在结果数组上调用np.mean – 你将不得不编写更多的代码。

另一种方法是使用简化范式。 作为一个例子,看看我们如何在python中使用reduce来计算数字的总和: reduce(lambda x,y: x+y, [1,2,5,4])

它是这样工作的:

  1. 第一步:从列表中读取两位数字 – 1,2。 评估lambda 1,2。 减less存储结果3.注意 – 这是从列表中读取两位数字的唯一步骤
  2. 步骤2:读取列表中的下一个数字 – 5.评估lambda 5,3(3是步骤1的结果,减less存储)。 减less存储结果8。
  3. 步骤3:读取列表中的下一个数字 – 4.评估lambda 8,4(8是步骤2的结果,减less存储)。 减less存储结果12
  4. 第四步:从列表中读取下一个数字 – 没有,所以返回12的存储结果。

在这里阅读更多Python的函数式编程

要了解TensorFlow是如何应用的,请看下面的代码块,它定义了一个简单的graphics,它接受一个浮点数并计算平均值。 然而,图的input不是一个浮点数,而是一个浮点数。 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})) 

这个模式在计算批量图像的值时派上用场。 看看深度MNIST例子 ,你看到如下的代码:

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