这里的关键是来自函数编程的概念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:从清单中读取2位数字-1,2。评估lambda 1,2。 reduce存储结果3。注意-这是从列表中读出2位数字的唯一步骤
- 步骤2:从列表中读取下一个数字-5。评估lambda 5、3(3是步骤1的结果,即减少的存储量)。减少存储结果8。
- 步骤3:从列表中读取下一个数字-4.评估lambda 8,4(步骤2的结果为8,即减少了存储的值)。减少存储结果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}))
当计算成批图像的值时,此模式非常有用。查看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))
0
在MNIST初学者教程中 ,有一条声明
tf.cast
基本上改变了对象的张量类型,但是tf.reduce_mean
和np.mean
什么np.mean
?这是
tf.reduce_mean
上的文档:对于一维矢量,它看起来像
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)
?