O.r*_*rka 79 python numpy machine-learning mean tensorflow
在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"))
Run Code Online (Sandbox Code Playgroud)
对于一维矢量,它看起来像input_tensor但我不明白发生了什么reduction_indices.None有道理,因为[1,2]和[1,2]的平均值是[1.5,1.5],但是发生了什么np.mean == tf.reduce_mean?
Shu*_*his 100
功能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)
Run Code Online (Sandbox Code Playgroud)
产量
[ 3.5 5.5 6.5]
[ 3.5 5.5 6.5]
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到,当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)
Run Code Online (Sandbox Code Playgroud)
我们可以通过增加平均1在numpy,你会自然地,但为了做到这一点在tensorflow,您需要执行,在Session不使用Session你不能这样做.换句话说,当您进行计算时tfMean = tf.reduce_mean(c),tensorflow不会计算它.它只计算一个Session.但是当你写作时,numpy会立即计算出来np.mean().
我希望这是有道理的.
Nik*_*rge 18
这里的关键是单词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]).
它的工作原理如下:
阅读更多此处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}))
Run Code Online (Sandbox Code Playgroud)
在计算批量图像的值时,此模式非常有用.看看Deep MNIST示例,您可以在其中看到如下代码:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
Run Code Online (Sandbox Code Playgroud)
新文档指出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
Run Code Online (Sandbox Code Playgroud)
如果去掉类型转换,会看到不同的结果
在附加到这一点,许多其他tf.reduce_的功能,例如reduce_all,reduce_any,reduce_min,reduce_max,reduce_prod产生相同的值作为有numpy的类似物。显然,因为它们是操作,所以它们只能从会话内部执行。
| 归档时间: |
|
| 查看次数: |
54967 次 |
| 最近记录: |