在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: 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.]
对于一维矢量,它看起来像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 的功能是一样的。他们做同样的事情。从文档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操作。但是为了进行张量运算,必须在TensorflowSession 内完成。你可以在这里阅读更多资料。也就是说,当你需要对张量流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)
我们可以自然地在numpy中增加1,但是为了在tensorflow中做同样的事情,需要在Session中执行,而不使用Session,无法这样做。换句话说,当你计算tfMean = tf.reduce_mean(c)时,tensorflow不会计算它。它只在会话中计算。但是当你写np.mean()时,numpy立即计算出来。
参考资料
- Difference between np.mean and tf.reduce_mean in Numpy and Tensorflow?
|