tf.nn.moments函数
1.官方的输入定义如下:
def moments(x, axes, name=None, keep_dims=False)
- x理解为输出数据,形如[batchsize,height,width,kernels]
- axes表示在哪个维度上求解,是个list,例如[0,1,2]
这个函数的输出有两个:
Two Tensor
objects: mean
and variance
.
解释如下:
- mean 就是均值啦
- variance 就是方差啦
2.计算神经网络某层的mean和variance
假定我们需要计算数据的形状是 [batchsize, height, width, kernels],熟悉CNN的都知道,这个在tensorflow中太常见了,例程序如下:
img = tf.Variable(tf.random_normal([128, 32, 32, 64]))
axis = list(range(len(img.get_shape()) - 1))
mean, variance = tf.nn.moments(img, axis)
形如[128, 32, 32, 64]的数据在CNN的中间层非常常见,那么,为了给出一个直观的认识,这个函数的输出结果如下,可能输出的数字比较多。。。
mean = [ -1.58071518e-03 9.46253538e-04 9.92774963e-04 -2.57909298e-04
4.31227684e-03 2.85443664e-03 -3.51431966e-03 -2.95847654e-04
-1.57856941e-03 -7.36653805e-04 -3.81006300e-03 1.95848942e-03
-2.19231844e-03 1.88898295e-04 3.09050083e-03 1.28045678e-04
-5.45501709e-04 -7.49588013e-04 3.41436267e-03 4.55856323e-04
1.21808052e-03 1.71916187e-03 2.33578682e-03 -9.98377800e-04
1.01172924e-03 -3.25803459e-03 1.98090076e-03 -9.53197479e-04
3.37207317e-03 6.27857447e-03 -2.22939253e-03 -1.75476074e-04
1.82938576e-03 2.28643417e-03 -2.59208679e-03 -1.05714798e-03
-1.82652473e-03 4.51803207e-05 -1.38700008e-03 1.88308954e-03
-3.67999077e-03 -4.22883034e-03 8.54551792e-04 -1.30176544e-04
-1.02388859e-03 3.15248966e-03 -1.00244582e-03 -3.58343124e-04
9.68813896e-04 -3.17507982e-03 -2.61783600e-03 -5.57708740e-03
-3.49491835e-04 7.54106045e-03 -9.98616219e-04 5.13806939e-04
1.08468533e-03 1.58560276e-03 -2.76589394e-03 -1.18827820e-03
-4.92024422e-03 3.14301252e-03 9.12249088e-04 -1.98567938e-03]
variance = [ 1.00330877 1.00071466 1.00299144 1.00269675 0.99600208 0.99615276
0.9968518 1.00154674 0.99785519 0.99120021 1.00565553 0.99633628
0.99637395 0.99959981 0.99702841 0.99686354 1.00210547 1.00151515
1.00124979 1.00289011 1.0019592 0.99810153 1.00296855 1.0040164
1.00397885 0.99348587 0.99743217 0.99921477 1.00718474 1.00182319
1.00461221 1.00222814 1.00570309 0.99897575 1.00203466 1.0002507
1.00139284 1.0015136 1.00439298 0.99371535 1.00209546 1.00239146
0.99446201 1.00200033 1.00330424 0.99965429 0.99676734 0.99974728
0.99562836 1.00447667 0.9969337 1.0026046 0.99110448 1.00229466
1.00264072 0.99483615 1.00260413 1.0050714 1.00082493 1.00062656
1.0020628 1.00507069 1.00343442 0.99490905]
解释下这些数字是怎么来的,对于[128,32,32,64]这样的4维矩阵,一个batch里的128个图,经过一个64的kernels卷积层处理,得到了128*64个图,再针对每个kernel对应的128个图,求它们所有像素的均值和方差,因为总共有64个kernels,输出的结果就是一个长度为64的一维数组。