Tensorflow——BatchNormalization(tf.nn.moments及tf.nn.batch_normalization)

 

 

批标准化

  • 批标准化(batch normalization,BN)一般用在激活函数之前,使结果x=Wx+b 各个维度均值为0,方差为1。通过规范化让激活函数分布在线性区间,让每一层的输入有一个稳定的分布会有利于网络的训练。
  • 优点:
    加大探索步长,加快收敛速度。
    更容易跳出局部极小。
    破坏原来的数据分布,一定程度上防止过拟合。
    解决收敛速度慢和梯度爆炸。

方法一: 

tensorflow相应API

  • mean, variance = tf.nn.moments(x, axes, name=None, keep_dims=False)

    • 计算统计矩,mean 是一阶矩即均值,variance 则是二阶中心矩即方差,axes=[0]表示按列计算;
    • 对于以feature map 为维度的全局归一化,若feature map 的shape 为[batch, height, width, depth],则将axes赋值为[0, 1, 2]
  • tf.nn.batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None)

    • tf.nn.batch_norm_with_global_normalization(x, mean, variance, beta, gamma, variance_epsilon, scale_after_normalization, name=None);
    • tf.nn.moments 计算返回的 mean 和 variance 作为 tf.nn.batch_normalization 参数调用

计算每个列的均值及方差。

import tensorflow as tf
W = tf.constant([[-2.,12.,6.],[3.,2.,8.]], )
mean,var = tf.nn.moments(W, axes = [0])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    resultMean = sess.run(mean)
    print(resultMean)
    resultVar = sess.run(var)
    print(resultVar)
#输出
[ 0.5      7.    7.  ]
[ 6.25   25.     1.  ]

标准化

size = 3
scale = tf.Variable(tf.ones([size]))
shift = tf.Variable(tf.zeros([size]))
epsilon = 0.001
W = tf.nn.batch_normalization(W, mean, var, shift, scale, epsilon)
#参考下图BN的公式,相当于进行如下计算
#W = (W - mean) / tf.sqrt(var + 0.001)
#W = W * scale + shift

with tf.Session() as sess:
    #必须要加这句不然执行多次sess会报错
    sess.run(tf.global_variables_initializer())
    resultW = sess.run(W)
    print(resultW)
#观察初始W第二列 12>2 返回BN的W值第二列第二行是负的,其余两列相反

#输出
[[-0.99992001  0.99997997 -0.99950027]
 [ 0.99991995 -0.99997997  0.99950027]]

 

方法二(批量归一化的简单用法)

上面的函数虽然参数不多,但是需要几个函数联合起来使用,于是TensorFlow中的layers模块里又实现了一次BN函数,相当于把几个函数合并到了一起,使用起来更加简单。下面来介绍一下,使用时需要引入:

from tensorflow.contrib.layers.python.layers import batch_norm

或者直接调用tf.contrib.layers.batch_norm(),该函数的定义如下:

def batch_norm(inputs,
               decay=0.999,
               center=True,
               scale=False,
               epsilon=0.001,
               activation_fn=None,
               param_initializers=None,
               param_regularizers=None,
               updates_collections=ops.GraphKeys.UPDATE_OPS,
               is_training=True,
               reuse=None,
               variables_collections=None,
               outputs_collections=None,
               trainable=True,
               batch_weights=None,
               fused=False,
               data_format=DATA_FORMAT_NHWC,
               zero_debias_moving_mean=False,
               scope=None,
               renorm=False,
               renorm_clipping=None,
               renorm_decay=0.99):

tf.contrib.layers.batch_norm()函数的具体详细使用教程链接https://www.cnblogs.com/zyly/p/8996070.html 

 

 

 

reference:

BN作用https://blog.csdn.net/buddhistmonk/article/details/79769928

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾世林jiashilin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值