[pytorch] pytorch常用normalization函数详解
Normalization归一化的使用在机器学习的领域中有着及其重要的作用,笔者在以前的项目中发现,有的时候仅仅给过了网络的feature加一层normzalize层,就可以让性能提高几个点,所以在这篇文章里详细介绍一下pytorch官方给出的几个normalization函数。
归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance、Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2019年);这些归一化方法都是一些经典的paper中提出的,后来使用广泛之后pytorch就会封装好方便大家调用。
简单来收,将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,
- batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
- layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
- InstanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
- GroupNorm将channel分组,然后再做归一化;
- SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
BatchNorm
batchNorm是在batch上,对NHW做归一化;即是将同一个batch中的所有样本的同一层特征图抽出来一起求mean和variance
加快收敛速度,允许网络使用更高的学习率。可作为一个正则化器,减少对dropout的需求
但是当batch size较小时(小于16时),效果会变差,这时使用group norm可能得到的效果会更好
class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
参数:
- num_features: C来自期待的输入大小(N,C,H,W)
- eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- momentum: 动态均值和动态方差所使用的动量。默认为0.1。
- affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。
LayerNorm
layerNorm在通道方向上,对CHW归一化;即是将batch中的单个样本的每一层特征图抽出来一起求一个mean和variance,与batch size无关,不同通道有着相同的均值和方差。
CLASS torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
参数:
- normalized_shape (int or list or torch.Size): 来自期待输入大小的输入形状
如果使用单个整数,则将其视为一个单例列表,并且此模块将在最后一个维度上进行规范化,而最后一个维度应该具有特定的大小。 - eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- elementwise_affine: 一个布尔值,当设置为True时,此模块具有可学习的元素仿射参数,γ初始化为1(表示权重)和β初始化为0(表示偏差)。默认值:True。
import torch
input = torch.randn(2,3,2,2)
import torch.nn as nn
#取消仿射变换要写成
#m = nn.LayerNorm(input.size()[1:], elementwise_affine=False)
m1 = nn.LayerNorm(input.size()[1:])#input.size()[1:]为torch.Size([3, 2, 2])
output1 = m1(input)
#只normalize后两个维度
m2 = nn.LayerNorm([2,2])
output2 = m2(input)
m3 = nn.LayerNorm(2)
output3 = m3(input)
InstanceNorm
instanceNorm在图像像素上,对HW做归一化;即是对batch中的单个样本的每一层特征图抽出来一层层求mean和variance,与batch size无关。若特征层为1,即C=1,准则instance norm的值为输入本身
CLASS torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
GroupNorm
GroupNorm将channel分组;即是将batch中的单个样本的G层特征图抽出来一起求mean和variance,与batch size无关
当batch size较小时(小于16时),使用该normalization方法效果更好
CLASS torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
参数:
- num_features(int): 将通道分成的组的数量
- num_channels(int):输入期待的通道数
- eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。
import torch
input = torch.randn(2,4,3,3)
import torch.nn as nn
#将4个通道分为2组
m1 = nn.GroupNorm(2,4)
output1 = m1(input)
#将4个通道分为4组,等价于Instance Norm
m2 = nn.GroupNorm(4,4)
output2 = m2(input)
来源:CSDN
作者:Wang Junke
链接:https://blog.csdn.net/weixin_43844219/article/details/104600514