Batch Normalization
- 一般用在激活函数之前,使结果x=Wx+b 各个维度mean为0,variance为1。通过规范化让激活函数分布在线性区间,让每一层的输入有一个稳定的分布会有利于网络的训练。
- 神经网络各层之间的传递称为特征图(feature map),特征图在传递的过程中,用BN进行调整。
mean, variance = tf.nn.moments(x, axes, name=None, keep_dims=False) # 计算统计矩,mean 是一阶矩即均值,variance 则是二阶中心矩即方差,axes=[0]表示按列计算;
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 参数调用;
Layer Normalization
- BN特别依赖Batch Size。
- BN对处理序列化数据的网络比如RNN是不太适用的。
- BN只在训练的时候用,inference的时候不会用到,因为inference的输入不是批量输入。
LN的操作类似于将BN做了一个“转置”,对同一层网络的输出做一个标准化。注意,同一层的输出是单个图片的输出,比如对于一个batch为32的神经网络训练,会有32个均值和方差被得出,每个均值和方差都是由单个图片的所有channel之间做一个标准化。这么操作,就使得LN不受batch size的影响。
参考:
https://blog.csdn.net/liuxiao214/article/details/81037416
https://blog.csdn.net/leviopku/article/details/83109422
https://blog.csdn.net/zhangjunhit/article/details/53169308