在MNIST beginner tutorial中,有声明
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
基本上会改变对象的张量类型,但tf.reduce_mean
和np.mean
之间有什么区别?
以下是tf.reduce_mean
上的文档:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
input_tensor
:要减少的张量。应该有数字类型。
reduction_indices
:要减少的维度。如果None
(defaut),则减少所有维度。# '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.]
对于1D向量,它看起来像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)
会发生什么?
答案 0 :(得分:90)
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
内完成。您可以阅读更多相关信息here。因此,当您需要对张量流图(或结构,如果愿意)执行任何计算时,必须在张量流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
中执行该操作,而不使用{{1}你无法做到这一点。换句话说,当您计算Session
时,张量流不会计算它。它只计算tfMean = tf.reduce_mean(c)
中的值。但是当你写Session
时,numpy会立即计算出来。
我希望这是有道理的。
答案 1 :(得分:12)
这里的关键词是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])
。
它的工作原理如下:
在此处阅读更多Functional Programming in 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))
答案 2 :(得分:1)
新文档指出tf.reduce_mean()
产生与np.mean相同的结果:
相当于np.mean
它与np.mean具有完全相同的参数。但这里有一个重要的区别:它们仅在浮动值上产生相同的结果 :
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_all
,reduce_any
,reduce_min
,reduce_max
,reduce_prod
也会产生相同的功能价值观就像那些笨拙的类比。显然,因为它们是操作,它们只能从会话内部执行。
答案 3 :(得分:-1)
1
通常是指行,而2
通常是指列。减少" over" index 1
表示逐行减少。
[1., 2.]
只是[ <row 1 mean> , <row 2 mean> ]
。
这种索引编号惯例在stats软件中很常见,尤其是R。