Numpy和Tensorflow中的np.mean和tf.reduce_mean之间的区别?
在MNIST初学者教程中 ,有accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
基本上改变了对象的张量types,但是tf.reduce_mean
和np.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.mean
和tensorflow.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_all
, reduce_any
, reduce_min
, reduce_max
, reduce_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,2。 评估lambda 1,2。 减less存储结果3.注意 – 这是从列表中读取两位数字的唯一步骤
- 步骤2:读取列表中的下一个数字 – 5.评估lambda 5,3(3是步骤1的结果,减less存储)。 减less存储结果8。
- 步骤3:读取列表中的下一个数字 – 4.评估lambda 8,4(8是步骤2的结果,减less存储)。 减less存储结果12
- 第四步:从列表中读取下一个数字 – 没有,所以返回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))