批标准化
- 批标准化(batch normalization,BN)一般用在激活函数之前,使结果
各个维度均值为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