热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

torch归一化,momentum用法详解

torch有两个地方用Momentum动量,冲量,一,优化器中的Momentum主要是在训练网络时,最开始会对网络进行权值初

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

推荐阅读
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 本文深入探讨了NDK与JNI技术在实际项目中的应用及其学习路径。通过分析工程目录结构和关键代码示例,详细介绍了如何在Android开发中高效利用NDK和JNI,实现高性能计算和跨平台功能。同时,文章还提供了从基础概念到高级实践的系统学习指南,帮助开发者快速掌握这些关键技术。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 本课程详细解析了Spring AOP的核心概念及其增强机制,涵盖前置增强、后置增强和环绕增强等类型。通过具体示例,深入探讨了如何在实际开发中有效运用这些增强技术,以提升代码的模块化和可维护性。此外,还介绍了Spring AOP在异常处理和性能监控等场景中的应用,帮助开发者更好地理解和掌握这一强大工具。 ... [详细]
author-avatar
乐在TV
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有