torch 有两个地方用Momentum动量,冲量,

一,优化器中的Momentum
主要是在训练网络时,最开始会对网络进行权值初始化,但是这个初始化不可能是最合适的;因此可能就会出现损失函数在训练的过程中出现局部最小值的情况,而没有达到全局最优的状态。

momentum的出现可以在一定程度上解决这个问题。动量来源于物理学,当momentum越大时,转换为势能的能量就越大,就越有可能摆脱局部凹区域,从而进入全局凹区域。momentum主要是用于权值优化。
二,bn层中的Momentum

⚠️这个momentum参数不同于优化器optimizer类中使用的momentum参数和momentum的传统概念。从数学上讲,这里运行统计数据的更新规则是 :

  • x是估计的数据
  • xt是新的观察到的数据

xnew = (1-momentum) * x + momentum * xt

pytorch常用normalization函数

Switchable Normalization 代码地址:

pytorch常用normalization函数

参考:https://blog.csdn.net/liuxiao214/article/details/81037416

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2019年);

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

  • batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
  • layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
  • instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
  • GroupNorm将channel分组,然后再做归一化;
  • SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

1.BN

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)

对小批量(mini-batch)3d数据组成的4d输入进行批标准化(Batch Normalization)操作

进行了两步操作:可见Batch Normalization的解释

  • 先对输入进行归一化,E(x)为计算的均值,Var(x)为计算的方差
  • 然后对归一化的结果进行缩放和平移,设置affine=True,即意味着weight(γ)和bias(β)将被使用

在每一个小批量(mini-batch)数据中,计算输入各个维度的均值和标准差。γ与β是可学习的大小为C的参数向量(C为输入大小)。默认γ取值为U(0,1),β设置为0

同样,默认情况下,在训练期间,该层将运行其计算的平均值和方差的估计值,然后在验证期间使用这些估计值(即训练求得的均值/方差)进行标准化。运行估计(running statistics)时保持默认momentum为0.1。

如果track_running_stats被设置为False,那么这个层就不会继续运行验证,并且在验证期间也会使用批处理统计信息。

因为批处理规范化是在C维(channel通道维度)上完成的,计算(N,H,W)片上的统计信息,所以通常将其称为空间批处理规范化。

参数:

  • num_features: C来自期待的输入大小(N,C,H,W)
  • eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
  • momentum: 动态均值和动态方差所使用的动量。默认为0.1。
  • affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。
  • track_running_stats:一个布尔值,当设置为True时,该模块跟踪运行的平均值和方差,当设置为False时,该模块不跟踪此类统计数据,并且始终在train和eval模式中使用批处理统计数据。默认值:True

Shape:

输入:(N, C,H, W)

输出:(N, C, H, W)(输入输出相同)

举例:

当affine=True时

import torch
from 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())

返回:

Parameter containing:
tensor([0.5247, 0.4397], requires_grad=True)
Parameter containing:
tensor([0., 0.], requires_grad=True)
tensor([[[[ 0.8316, -1.6250,  0.9072,  0.2746],[ 0.4579, -0.2228,  0.4685,  1.2020],[ 0.8648, -1.2116,  1.0224,  0.7295]],[[ 0.4387, -0.8889, -0.8999, -0.2775],[ 2.4837, -0.4111, -0.6032, -2.3912],[ 0.5622, -0.0770, -0.0107, -0.6245]]]])
tensor([[[[ 0.3205, -1.1840,  0.3668, -0.0206],[ 0.0916, -0.3252,  0.0982,  0.5474],[ 0.3409, -0.9308,  0.4373,  0.2580]],[[ 0.2664, -0.2666, -0.2710, -0.0211],[ 1.0874, -0.0747, -0.1518, -0.8697],[ 0.3160,  0.0594,  0.0860, -0.1604]]]],grad_fn=<NativeBatchNormBackward>)
torch.Size([1, 2, 3, 4])

当affine=False时

import torch
from torch import nnm = nn.BatchNorm2d(2,affine=False)
print(m.weight)
print(m.bias)input = torch.randn(1,2,3,4)
print(input)
output = m(input)
print(output)
print(output.size())

返回:

None
None
tensor([[[[-1.5365,  0.2642,  1.0482,  2.0938],[-0.0906,  1.8446,  0.7762,  1.2987],[-2.4138, -0.5368, -1.2173,  0.2574]],[[ 0.2518, -1.9633, -0.0487, -0.0317],[-0.9511,  0.2488,  0.3887,  1.4182],[-0.1422,  0.4096,  1.4740,  0.5241]]]])
tensor([[[[-1.2739,  0.0870,  0.6795,  1.4698],[-0.1811,  1.2814,  0.4740,  0.8689],[-1.9368, -0.5183, -1.0326,  0.0819]],[[ 0.1353, -2.3571, -0.2028, -0.1837],[-1.2182,  0.1320,  0.2894,  1.4478],[-0.3080,  0.3129,  1.5106,  0.4417]]]])
torch.Size([1, 2, 3, 4])

2.InstanceNorm2d(当mini-batch时使用)

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)

在4D输入上应用instance Normalization(带有额外channel维度的mini-batch 2D输入),即shape为[N,C,H,W]

在mini-batch中的对象的均值和标准差是每个维度分开计算的。如果affine=True,则γ和β这两个可学习的参数向量,大小为C,C为输入大小。

这一层使用从训练和评估模式的输入数据计算得到的instace数据。

如果track_running_stats被设置为True,那么在训练期间,该层将继续运行计算均值和方差的估计,得到的均值和方差将使用到评估(eval)时的normalization中。运行估计时保持默认momentum为0.1。

⚠️这个momentum参数不同于优化器optimizer类中使用的momentum参数和momentum的传统概念。从数学上讲,这里运行统计数据的更新规则是 :

  • x是估计的数据
  • xt是新的观察到的数据

xnew = (1-momentum) * x + momentum * xt

⚠️

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

参数:

  • num_features: C来自期待的输入大小(N,C,H,W)
  • eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
  • momentum: 动态均值和动态方差所使用的动量。默认为0.1。
  • affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。
  • track_running_stats:一个布尔值,当设置为True时,该模块跟踪运行的平均值和方差,当设置为False时,该模块不跟踪此类统计数据,并且始终在train和eval模式中使用批处理统计数据。默认值:False

Shape:

输入:(N, C,H, W)

输出:(N, C, H, W)(输入输出相同)

举例:

import torch
input = torch.randn(2,3,2,2)
input

返回:

View Code

import torch.nn as nn
#声明仿射变换要写成
#m = nn.InstanceNorm2d(3, affine=True)
m = nn.InstanceNorm2d(3)#feature数量,即channel number = 3
output = m(input)
output

返回:

View Code

3.LayerNorm(当mini-batch时使用)

layerNorm在通道方向上,对CHW归一化;即是将batch中的单个样本的每一层特征图抽出来一起求一个mean和variance,与batch size无关,不同通道有着相同的均值和方差

CLASS torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)

平均值和标准偏差分别计算在最后几个维数上,这些维数必须是normalized_shape指定的形状。如果elementwise_affine=True,则γ和β为两个可学习的仿射变换参数向量,大小为normalized_shape

⚠️与batch normalization和instance normalization不同,batch normalization使用affine选项为每个通道/平面应用标量尺度γ和偏差β,而layer normalization使用elementwise_affine参数为每个元素应用尺度和偏差。

这一层使用从训练和评估模式的输入数据计算得到的统计数据。

参数:

  • normalized_shape (int or list or torch.Size): 来自期待输入大小的输入形状

    如果使用单个整数,则将其视为一个单例列表,并且此模块将在最后一个维度上进行规范化,而最后一个维度应该具有特定的大小。

  • eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
  • elementwise_affine 一个布尔值,当设置为True时,此模块具有可学习的元素仿射参数,γ初始化为1(表示权重)和β初始化为0(表示偏差)。默认值:True。

Shape:

输入:(N, *)

输出:(N, *)(输入输出相同)

举例:

import torch
input = torch.randn(2,3,2,2)
input

返回:

View Code

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)
output1

返回:

View Code

#只normalize后两个维度
m2 = nn.LayerNorm([2,2])
output2 = m2(input)
output2

返回:

View Code

#只normalize最后一个维度
m3 = nn.LayerNorm(2)
output3 = m3(input)
output3

返回:

View Code

4.GroupNorm(当mini-batch时使用)

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_groups组,每个组包含num_channels / num_groups个通道。每组的均值和标准差分开计算。如果affine=True,则γ和β这两个可学习的通道仿射变换参数向量的大小为num_channels。

这一层使用从训练和评估模式的输入数据计算得到的统计数据。

参数:

  • num_features(int): 将通道分成的组的数量
  • num_channels(int):输入期待的通道数
  • eps: 即上面式子中分母的ε ,为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
  • affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即γ与β。

Shape:

输入:(N, C,*) ,C = num_channels

输出:(N, C, *)(输入输出相同)

举例:

import torch
input = torch.randn(2,4,3,3)
input

返回:

View Code

import torch.nn as nn
#将4个通道分为2组
m1 = nn.GroupNorm(2,4)
output1 = m1(input)
output1

返回:

View Code

#将4个通道分为4组,等价于Instance Norm
m2 = nn.GroupNorm(4,4)
output2 = m2(input)
output2

返回:

View Code

#将4个通道分为4组,等价于layer Norm
m3 = nn.GroupNorm(4,4)
output3 = m3(input)
output3

返回:

pix2pix代码中该部分的使用:

class Identity(nn.Module):def forward(self, x):return xdef get_norm_layer(norm_type='instance'):"""返回标准化层Parameters:norm_type (str) -- 标准化层的名字,有: batch | instance | none对于BatchNorm,我们使用可学习的仿射参数并追踪运行数据(mean/stddev)对于InstanceNorm,我们不使用可学习的仿射参数也不追踪运行数据"""if norm_type == 'batch':norm_layer = functools.partial(nn.BatchNorm2d, affine=True, track_running_stats=True)elif norm_type == 'instance':norm_layer = functools.partial(nn.InstanceNorm2d, affine=False, track_running_stats=False)elif norm_type == 'none':norm_layer = lambda x: Identity()else:raise NotImplementedError('normalization layer [%s] is not found' % norm_type)return norm_layer

torch 归一化,momentum用法详解相关推荐

  1. conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解

    Conv2d的简单使用 torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似,但不完全一样. 在 torch 中,Conv2d 有几个基本的参数,分别是 in_channel ...

  2. torch.stack(), torch.cat()用法详解

    torch.stack(), torch.cat()用法详解 if __name__ == '__main__':import torchx_dat = torch.tensor([[1, 2], [ ...

  3. python中如何反解函数_PyTorch中反卷积的用法详解

    pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, str ...

  4. PaddlePaddle基本用法详解(二)、PaddelPaddle训练水果分类模型

    PaddlePaddle基本用法详解(二).PaddelPaddle训练分类模型 1.基本用法 2.训练水果分类模型 1.基本用法 2.训练水果分类模型 1.数据集预处理与模型定义代码: import ...

  5. 有关mapminmax的用法详解

    ============外一篇 有关mapminmax的用法详解 by faruto================================== 几个要说明的函数接口: [Y,PS] = ma ...

  6. python中permute_PyTorch中permute的用法详解

    PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...

  7. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  8. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  9. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

最新文章

  1. nbu oracle 冷备_NBU备份系统应用操作手册..doc
  2. 相关方登记册模板_项目的主要相关方
  3. php数字两位小数_PHP保留两位小数的几种方法
  4. Java之接口的静态方法的定义和使用
  5. matlab实现非线性规划
  6. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
  7. 华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新
  8. SparkStreaming之transform
  9. 通过SecureCRT访问亚马逊Amazon EC2主机
  10. 深度学习-吴恩达-笔记-1-深度学习引言
  11. ThinkPHP 3.1.2 控制器的模块和操作
  12. 2个版本并存的python使用新的版本安装django的方法
  13. 阶段3 2.Spring_06.Spring的新注解_6 Qualifier注解的另一种用法
  14. Php-SPL库中的迭代器类详解
  15. 【图像处理】镜头去污渍(未完全实现):python + OpenCV
  16. python操作Jinkins
  17. Java PermGen 去哪里了?
  18. 学术-物理-维空间:二维空间
  19. Nginx的一些配置项,Nginx调优
  20. (笔记)数据结构--抽象数据类型的定义

热门文章

  1. openwrt下让telnetl与ssh(dropbear)共存
  2. linux下kill命令小结
  3. Spring 使用注解方式进行事物管理
  4. Linux C编程--打开和关闭流
  5. openstack-Mitaka Glance上传镜像报错
  6. html5 websocket发送图片,通过WebSocket连接,实现Image从服务器到浏览器的传输
  7. 历年计算机一级考试题库及答案,全国计算机一级考试试题库及答案
  8. 算法 - 求一个正整数的二进制表示中1的个数(C++)
  9. 专题2 文件系统结构
  10. 内核网络中的GRO、RFS、RPS技术介绍和调优