[pytorch] pytorch常用normalization函数详解

[pytorch] pytorch常用normalization函数详解

Normalization归一化的使用在机器学习的领域中有着及其重要的作用,笔者在以前的项目中发现,有的时候仅仅给过了网络的feature加一层normzalize层,就可以让性能提高几个点,所以在这篇文章里详细介绍一下pytorch官方给出的几个normalization函数。

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、InstanceNormalization(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

基于以下公式:

y = γ \gamma γ * x - μ ( x ) \mu(x) μ(x) / sqrt(var(x) + ϵ \epsilon ϵ) + β \beta β

batchNorm是在batch上,对NHW做归一化;即是将同一个batch中的所有样本的同一层特征图抽出来一起求mean和variance。这里所说的对NHW做归一化的含义就是在NHW的数据维度上计算mean和variance,也就说把一个batch的数据的一个channel的H*W的feature map统计在一起计算。

加快收敛速度,允许网络使用更高的学习率。可作为一个正则化器,减少对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,给该层添加可学习的仿射变换参数,即γ与β。

这个momentum参数不同于优化器optimizer类中使用的momentum参数和momentum的传统概念。从数学上讲,这里运行统计数据的更新规则是 :
x是估计的数据; xt是新的观察到的数据
x n e w x_{new} xnew = (1-momentum) * x + momentum * x t x_{t} xt

import torch
from torch import nn

m = nn.BatchNorm2d(2,affine=True)
print(m.weight)
print(m.bias)

input = torch.randn(1,2,3,4)
print(input)
output = m(input)
print(output)
print(output.size())

InstanceNorm

instanceNorm在图像像素上,对HW做归一化;即是对batch中的单个样本的每一层特征图抽出来一层层求mean和variance,与batch size无关。若特征层为1,即C=1,准则instance norm的值为输入本身。也就是说我们所说的在HW维度上其实是对于每一个像素而言的,如果是channel=1的话那么instance里的每一个像素点的均值都是本身。

CLASS torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)

InstanceNorm2d和LayerNorm非常相似,但是有一些细微的差别。InstanceNorm2d应用于RGB图像等信道数据的每个信道,而LayerNorm通常应用于整个样本,并且通常用于NLP任务。此外,LayerNorm应用元素仿射变换,而InstanceNorm2d通常不应用仿射变换。

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)

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)
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页