查过很多次,但是一旦一段时间过去后,就会忘记,还是自己做个总结比较好。
首先Normalization做的是规范化,假设原数据是多维向量,符合某种均值与方差的正态分布,那么规范化就是在多维向量的某些维度上,将向量正态分布的均值与方差变为0与1。不同的normalization的区别在于均值与方差计算方式的不同,将均值u与方差d计算出来后,对多维向量的每个元素进行如下操作:(x-u)/d。
均值与方差计算方式举例如下。
x_test = np.array([[[1,2,-1,1],[3,4,-2,2]],
[[1,2,-1,1],[3,4,-2,2]]])
x_test = torch.from_numpy(x_test).float()
上述tensor的size是2x2x4(BxCxN),对应一维的normalization。
上图的意思解释如下:
BN: NHWC ~~~> 111C的意思是,每个NHW为一个计算单位,计算出每个NHW的均值与方差,共有C个,随后每个元素用对应的均值与方差进行规范化。
IN:NHWC ~~~> N11C,计算出NC个均值与方差,每个HW为一个计算单位。
LN: NHWC ~~~> N111,计算出N个均置于方差,每个HWC为一个计算单位。
至于适用场景,复制粘贴一个其他人的.
batchNorm是在batch上,对小batchsize效果不好;
layerNorm在通道方向上,主要对RNN作用明显;
instanceNorm在图像像素上,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化, 在batchsize<16的时候, 可以使用这种归一化;