在MNIST初学者教程中,有一个语句
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(缺陷)减少所有维数.‘X’是[ 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。
对于一维向量,它看起来像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)是怎么回事?
发布于 2015-12-12 06:55:01
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操作。但是,为了完成tensorflow操作,必须在tensorflow Session中完成。您可以阅读更多关于它的这里。因此,当您需要对tensorflow图(或结构(如果愿意)执行任何计算时,它必须在tensorflow 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中计算这个值。但是当您编写np.mean()时,numpy会立即计算出这一点。
我希望这是合理的。
发布于 2017-11-11 19:58:05
这里的关键是单词reduce,它是函数式编程中的一个概念,它使reduce_mean在TensorFlow中能够保持一批输入的计算结果的运行平均值。
如果您不熟悉函数式编程,这可能看起来很神秘。首先让我们看看reduce做了什么。如果给你一个像1,2,5,4这样的列表,然后被告知计算平均值,这很容易--把整个数组传递给np.mean,就可以得到平均值。然而,如果你必须计算一个数字流的平均值呢?在这种情况下,首先必须从流中读取数组来组装数组,然后对结果数组调用np.mean --您必须编写更多的代码。
另一种选择是使用约简范式。举个例子,看看我们如何在python中使用reduce来计算数字之和:reduce(lambda x,y: x+y, [1,2,5,4])。
它的工作方式如下:
在这里阅读更多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}))当在成批图像上计算值时,这种模式很方便。在深层MNIST实例中,您可以看到如下代码:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))发布于 2017-05-01 01:19:23
新文档指出,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 )产生与numpy类似物相同的值。显然,因为它们是操作,所以只能从会话内部执行它们。
https://stackoverflow.com/questions/34236252
复制相似问题