1.batch normalization
per channel across mini-batch
对于四维张量[N, C, W, H],取每个批次的均值 torch.mean(dim=(0,2,3), keepdim=True)得到[1, C, 1, 1]形状的张量,即在批次的每个通道上求一个均值做归一化。
2.layer normalization
per sample,per layer
对于四维张量[N, C, W, H],取每个样本的每层的均值 torch.mean(dim=(1,2,3), keepdim=True)得到[N,1,1, 1]形状的张量,即在对每个样本的每层求一个均值做归一化。
在NLP中[N, L, C]得到的均值统计量为[N, L]torch.mean(dim=-1, keepdim=True),这与CV的大不相同。
3.Instance normalization
per sample,per channel
对于四维张量[N, C, W, H],取每个样本的每层的均值 torch.mean(dim=(2,3), keepdim=True)得到[N,C,1, 1]形状的张量,即在对每个样本的每层(每个通道)求一个均值做归一化。在风格迁移中使用较多。
4.验证
# pytorch官方API
inputs = torch.randn((4, 3, 2, 2))
batch_norm = torch.nn.BatchNorm2d(3,affine=False) # affine=False关闭可学习参数的映射
api_out = batch_norm(inputs)
#手动实现
mean = inputs.mean(dim=(0, 2, 3), keepdim=True)
std = inputs.std(dim=(0, 2, 3), keepdim=True, unbiased=False) # unbiased=False设置有偏估计
out = (inputs-mean)/std
# 输出验证
print(api_out)
print(out)