pytorch BatchNorm参数详解,计算过程

pytorch BatchNorm参数详解,计算过程BatchNorm1d的参数:torch.nn.BatchNorm1d(num_features,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)

大家好,又见面了,我是你们的朋友全栈君。

目录

 

说明

BatchNorm1d参数

num_features

eps

momentum

affine

track_running_stats

BatchNorm1d训练时前向传播

BatchNorm1d评估时前向传播

总结


说明

网络训练时和网络评估时,BatchNorm模块的计算方式不同。如果一个网络里包含了BatchNorm,则在训练时需要先调用train(),使网络里的BatchNorm模块的training=True(默认是True),在网络评估时,需要先调用eval(),使网络里的BatchNorm模块的training=False。

BatchNorm1d参数

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

num_features

输入维度是(N, C, L)时,num_features应该取C;这里N是batch size,C是数据的channel,L是数据长度。

输入维度是(N, L)时,num_features应该取L;这里N是batch size,L是数据长度,这时可以认为每条数据只有一个channel,省略了C

eps

对输入数据进行归一化时加在分母上,防止除零,详情见下文。

momentum

更新全局均值running_mean和方差running_var时使用该值进行平滑,详情见下文。

affine

设为True时,BatchNorm层才会学习参数\gamma\beta,否则不包含这两个变量,变量名是weightbias,详情见下文。

track_running_stats

设为True时,BatchNorm层会统计全局均值running_mean和方差running_var,详情见下文。

BatchNorm1d训练时前向传播

  1. 首先对输入batch求E[x]Var[x],并用这两个结果把batch归一化,使其均值为0,方差为1。归一化公式用到了eps(\epsilon),即y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}。如下输入内容,shape是(3, 4),即batch_size=3,此时num_features需要传入4。
    tensor = torch.FloatTensor([[1, 2, 4, 1],
                                [6, 3, 2, 4],
                                [2, 4, 6, 1]])

    此时E[x]=[3, 3, 4, 2]Var[y]_{unbiased}=[7, 1, 4, 3](无偏样本方差)和Var[y]_{biased}=[4.6667, 0.6667, 2.6667, 2.0000](有偏样本方差),有偏和无偏的区别在于无偏的分母是N-1,有偏的分母是N。注意在BatchNorm中,用于更新running_var时,使用无偏样本方差即,但是在对batch进行归一化时,使用有偏样本方差,因此如果batch_size=1,会报错。归一化后的内容如下。

    [[-0.9258, -1.2247,  0.0000, -0.7071],
     [ 1.3887,  0.0000, -1.2247,  1.4142],
     [-0.4629,  1.2247,  1.2247, -0.7071]]
  2. 如果track_running_stats==True,则使用momentum更新模块内部的running_mean(初值是[0., 0., 0., 0.])和running_var(初值是[1., 1., 1., 1.]),更新公式是x_{new}=(1-momentum)\times x_{cur}+momentum\times x_{batch},其中x_{new}代表更新后的running_meanrunning_varx_{cur}表示更新前的running_meanrunning_varx_{batch}表示当前batch的均值和无偏样本方差。
  3. 如果track_running_stats==False,则BatchNorm中不含有running_meanrunning_var两个变量。
  4. 如果affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
  5. 如果affine==False,则BatchNorm中不含有weightbias两个变量,什么都都不做。

BatchNorm1d评估时前向传播

  1. 如果track_running_stats==True,则对batch进行归一化,公式为y=\frac{x-\hat{E}[x]}{\sqrt{\hat{Var}[x]+\epsilon }},注意这里的均值和方差是running_meanrunning_var,在网络训练时统计出来的全局均值和无偏样本方差。
  2. 如果track_running_stats==False,则对batch进行归一化,公式为y=\frac{x-{E}[x]}{\sqrt{​{Var}[x]+\epsilon }},注意这里的均值和方差是batch自己的mean和var,此时BatchNorm里不含有running_meanrunning_var注意此时使用的是无偏样本方差(和训练时不同),因此如果batch_size=1,会使分母为0,就报错了。
  3. 如果affine==True,则对归一化后的batch进行放射变换,即乘以模块内部的weight然后加上模块内部的bias,这两个变量都是网络训练时学习到的。
  4. 如果affine==False,则BatchNorm中不含有weightbias两个变量,什么都不做。

总结

在使用batchNorm时,通常只需要指定num_features就可以了。网络训练前调用train(),训练时BatchNorm模块会统计全局running_meanrunning_var,学习weightbias,即文献中的\gamma\beta。网络评估前调用eval(),评估时,对传入的batch,使用统计的全局running_meanrunning_var对batch进行归一化,然后使用学习到的weightbias进行仿射变换。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141980.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux -umask

    linux -umask

    2021年9月9日
    54
  • 网络安全未来发展前景_十四五国家网络安全规划

    网络安全未来发展前景_十四五国家网络安全规划第1章:中国网络安全行业发展综述1.1网络安全行业概述1.1.1网络安全产业的概念分析1.1.2网络安全产品和服务分类(1)依据主要功能及形态分类(2)依据安全防御生命周期技术能力分类1.2网络安全行业发展环境分析1.2.1行业政策环境分析(1)国际政策(2)国内政策1.2.2行业社会环境分析(1)境内感染网络病毒终端数(2)境内被篡改网站数量(3)境内被植入后门网站数量(4)安全漏洞数量1.2.3行业经济环境分析(1)国内生产总值分析(2)工业增加值分析.

    2022年10月5日
    4
  • 模块***已加载但找不到入口点DllRegisterServer,请确保***为有效的DLL或OCX文件,然后重试[通俗易懂]

    模块***已加载但找不到入口点DllRegisterServer,请确保***为有效的DLL或OCX文件,然后重试[通俗易懂]今天刷机,因为小米要刷第三方rom,所以要降级,格盘的那个软件需要这个dll,,但是没有找个这个,我就拷贝了下放到system32下面,然后还是不行,就直接执行注册,然后就报了这个错,其实很简单如果使用的是32位操作系统:只需把dll文件放到“X:\Windows\system32”(X代表您系统所在目录盘符,如:C:\Windows\system32);如果使用的是64位操

    2022年6月27日
    126
  • 点积与叉积[通俗易懂]

    点积与叉积[通俗易懂]1. 向量的点乘:向量点乘是其各个分量乘积的和几何意义:点乘的结果是一个标量,等于向量大小与夹角的cos值的乘积。                    a•b=|a||b|cosθ                如果a和b都是单位向量,那么点乘的结果就是其夹角的cos值。                    a•b=cosθ交换律:分配律:结合律:  其中m是实数。2.向量叉乘:两个…

    2025年7月26日
    6
  • win10 1分钟自动重启_windows7一分钟后自动重启

    win10 1分钟自动重启_windows7一分钟后自动重启前言Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。此时,我们只需网上找一个注册码即可解

    2022年7月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号