首页 > 编程知识 正文

pytorch语法,torch有必要做吗

时间:2023-05-06 13:35:24 阅读:173555 作者:133

深入研究[pytorch] pytorch中常用的正则化函数batchnorminstancenormlayernormgroupnorm

Normalization归一化的使用在机器学习领域有其重要的作用。 笔者在以前的项目中发现,只要在网络功能上增加归一化层,就可以在几个方面提高性能,因此,本文将详细介绍pytorch官方给出的几个归一化

正规化层目前主要有这些方法,Batch Normalization(2015年)、Layer Normalization(2015年)、Instance、3358 ww.com /

简单地接收,并将输入的图像形状标记为[N,c,h,W]。 这些方法的主要区别在于,

batchNorm是batch,是对NHW的规范化,对小的batchsize没有效果; layerNorm在信道方向上相对于CHW归一化,主要对RNN起显著作用; InstanceNorm在图像像素上对HW进行归一化,用于风格化迁移; GroupNorm对信道进行分组,然后归一化; SwitchableNorm是将BN、LN、IN组合起来进行加权,让网络自身学习正规化层应该使用什么样的方法。 BatchNorm基于以下表达式:

y=(伽马(x-) x ) mu ) x )) x )/sqrt ) var ) x ) Epsilon )) beta

batchNorm在batch上对NHW进行归一化; 即提取同一batch中所有样本的同一层特征图求mean和variance。Normalization

可以加快收敛速度,提高网络的学习率。 作为正则化器,可以减少对dropout的需求

但是,如果batch size较小(小于16 ),效果会变差,在这种情况下,使用group norm可能会获得更好的效果

classtorch.nn.batch norm 2d (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 torchfrom torch import nnm = 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 torchinput = 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 torchinput = torch.randn(2,4,3,3)import torch.nn as nn#将4个通道分为2组m1 = nn.GroupNorm(2,4)output1 = m1(input)#将4个通道分为4组,等价于Instance Normm2 = nn.GroupNorm(4,4)output2 = m2(input)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。