在MNIST初学者教程中,有tf.cast
tf.reduce_mean
基本上改变了对象的张量类型,但是np.mean
和tf.reduce_mean
?之间有什么区别?
这是关于以下内容的文档reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
:
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
对于一维矢量,它看起来像input_tensor
但我不明白发生了什么reduction_indices
.None
有道理,因为[1,2]和[1,2]的平均值是[1.5,1.5],但是发生了什么np.mean == tf.reduce_mean
?
功能numpy.mean
和tensorflow.reduce_mean
是相同的.他们做同样的事情.从文档中,对于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操作.但是为了进行张量流操作,必须在张量流内完成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)
我们可以通过增加平均1
在numpy
,你会自然地,但为了做到这一点在tensorflow,您需要执行,在Session
不使用Session
你不能这样做.换句话说,当您进行计算时tfMean = tf.reduce_mean(c)
,tensorflow不会计算它.它只计算一个Session
.但是当你写作时,numpy会立即计算出来np.mean()
.
我希望这是有道理的.
这里的关键是单词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步:从列表中读取2位数字 - 1,2.评估lambda 1,2.减少存储结果3.注意 - 这是从列表中读取2位数的唯一步骤
步骤2:从列表中读取下一个数字 - 5.评估lambda 5,3(3是步骤1的结果,减少存储的数量).减少存储结果8.
步骤3:从列表中读取下一个数字 - 4.评估lambda 8,4(8是步骤2的结果,减少存储的结果).减少存储结果12
第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}))
在计算批量图像的值时,此模式非常有用.看看Deep MNIST示例,您可以在其中看到如下代码:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))