张量不同数轴的平均值计算
转载:
http://blog.csdn.net/caimouse/article/details/59495858;
一、概述
在深度学习里研究的物体的关系,都是比较复杂的。比如一个图片32X32大小的,它的像素信息就有1024个点,如果考虑RGB三种颜色,就是1024X3了。对于目前还没有办法构造140亿个神经元的计算机来说,只能干一件事情,就是简化,化繁为简。为了简化,就需要使用算法来进行,在数学上最简单的处理,就是求平均值。这个道理非常简单,如果10个数,只要把它们相加,再除以10即可。对于0维数字,可以这样来计算,如果对于N维的张量,就不是这么简单的计算了。就拿二维的矩阵来说,它可以横着算,还可以是竖着算,还可以全部加到一起,再除以总数。可见对于N维的张量来说,有更多的可能,那么就得抽像一个数轴出来。数轴在初中的代数就学习了,可见数轴在高等数学里也会使用到的,N维张量,就是N个数轴的表示,如果沿着不同的数轴进行计算,就会产生不同的作用。其实平均值也可以算是降维思想的一种。
在TF里,就提供了这样一个算法来计算张量的平均值:
二、tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
沿着张量不同的数轴进行计算平均值。
三、参数:
input_tensor: 被计算的张量,确保为数字类型。
axis: 方向数轴,如果没有指明,默认是所有数轴都减小为1。
keep_dims: 如果定义true, 则保留维数,但数量个数为0.
name: 操作过程的名称。
reduction_indices: 为了旧函数兼容的数轴。
返回值:
降低维数的平均值。
三、实战
import tensorflow as tf #创建张量 x = tf.Variable([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]); #显示 init = tf.global_variables_initializer(); with tf.Session() as sess: sess.run(init); #tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None) y = tf.reduce_mean(x); y01 = tf.reduce_mean(x, axis=0, keep_dims=False); y02 = tf.reduce_mean(x, axis=0, keep_dims=True); y1 = tf.reduce_mean(x, axis=1); print("x = ", x.eval()); print("tf.reduce_mean(x) = ", y.eval()); print("tf.reduce_mean(x, axis=0, keep_dims=False) = ", y01.eval()); print("tf.reduce_mean(x, axis=0, keep_dims=True) = ", y02.eval()) print("tf.reduce_mean(x, axis=1) = ", y1.eval());
执行结果:
('x = ', array([[ 1., 2., 3.], [ 4., 5., 6.], [ 7., 8., 9.]], dtype=float32)) ('tf.reduce_mean(x) = ', 5.0) ('tf.reduce_mean(x, axis=0, keep_dims=False) = ', array([ 4., 5., 6.], dtype=float32)) ('tf.reduce_mean(x, axis=0, keep_dims=True) = ', array([[ 4., 5., 6.]], dtype=float32)) ('tf.reduce_mean(x, axis=1) = ', array([ 2., 5., 8.], dtype=float32))
总结:
tf.reduce_mean(x)表示计算全局平均值;
tf.reduce_mean(x, axis=0)表示计算y轴平均值;
tf.reduce_mean(x, axis=1)表示计算x轴平均值;