【文章一】
tensorflow中关于BN(Batch Normalization)的函数主要有两个,分别是:
- tf.nn.moments
- tf.nn.batch_normalization
关于这两个函数,官方API中有详细的说明,具体的细节可以点链接查看,关于BN的介绍可以参考这篇论文,我来说说自己的理解。
不得不吐槽一下,tensorflow的官方API很少给例子,太不人性化了,人家numpy做的就比tensorflow强。
对了,moments函数的计算结果一般作为batch_normalization的部分输入!这就是两个函数的关系,下面展开介绍!
一、tf.nn.moments函数
官方的输入定义如下:
def moments(x, axes, name=None, keep_dims=False)
解释如下:
- x 可以理解为我们输出的数据,形如 [batchsize, height, width, kernels]
- axes 表示在哪个维度上求解,是个list,例如 [0, 1, 2]
- name 就是个名字,不多解释
- keep_dims 是否保持维度,不多解释
这个函数的输出有两个,用官方的话说就是:
Two
Tensor
objects:mean
andvariance
.
解释如下:
- mean 就是均值啦
- variance 就是方差啦
关于这个函数的最基本的知识就介绍完了,但依然没明白这函数到底是干啥的,下面通过几个例子来说明:
-
1、计算2×3维向量的mean和variance,程序节选如下:
img = tf.Variable(tf.random_normal([2, 3])) axis = list(range(len(img.get_shape()) - 1)) mean, variance = tf.nn.moments(img, axis)
输出的结果如下:
img = [[ 0.69495416 2.08983064 -1.08764684] [ 0.31431156 -0.98923939 -0.34656194]] mean = [ 0.50463283 0.55029559 -0.71710438] variance = [ 0.0362222 2.37016821 0.13730171]
有了例子和结果,就很好理解了,moments函数就是在 [0] 维度上求了个均值和方差,对于axis这个参数的理解,可以参考这里。
另外,针对2×3大小的矩阵,axis还可以这么理解,若axis = [0],那么我们2×3的小矩阵可以理解成是一个包含了2个长度为3的一维向量,然后就是求这两个向量的均值和方差啦!多个向量的均值、方差计算请自行脑补。
当然了,这个例子只是一个最简单的例子,如果换做求形如“[batchsize, height, width, kernels]”数据的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