完全解读BatchNorm2d归一化算法原理

本文深入探讨了在调试Yolo3算法源码时遇到的BatchNorm2d层产生Nan值的问题,通过代码示例详细解析了BatchNorm2d在训练和测试阶段的工作原理,包括参数解释、算法实现及如何避免Nan值出现。

最近小编在研究yolo3的算法源码,在调试过程中发现中间层的BatchNorm2d的结果竟然出现了Nan。

第一次遇到这种情况,为了找出其中的原因,小编查阅了Pytorch官网关于BatchNorm2d的函数解释和网上关于该函数的相关博客,脑壳还是有点模糊,没有代码的测试验证,仅仅用文字去解释BatchNorm2d函数,初学者很容易一头雾水,半知半懂。

本文结合代码去验证BatchNorm2d的算法实现,若有不懂,读者可以参考文中代码并修改参数,来验证自己对该函数的理解是否准确。

实际项目中,我们处理的数据大部分是4维的,如:

其中N为数据个数,C为通道数,H,W分别表示图形的宽和高。

我们用BatchNorm2d归一化上述的数据结构,值得注意的是归一化是每个通道的归一化,以每个通道作为视角来归一化数据。

首先引用Pytorch官网对BatchNorm2d的描述:

BatchNorm2d的计算公式:

其中x为需要归一化的输入数据,为批量数据的均值和方差,为防止分母出现零所增加的变量,γ和β是对输入值进行仿射操作,即线性变换。γ和β的默认值分别为1和0,仿射包含了不进行仿射的结果,使得BatchNormlization的引入至少不降低模型,γ和β为模型的学习参数。

下面介绍BatchNorm2d的参数解释:

  • num_features:通道数,即维度大小的C。

  • eps:为使数值稳定而在分母上增加的值。默认值:1 e-5

  • momentum:期望和方差的更新参数,与动量梯度下降法类似,期望和方差的更新公式:

为模型的均值或方差,为当前观测值的均值或方差,为更新后的均值或方差,momentum为更新参数。

  • affine:归一化是否需要仿射,若设置为True,则需要对模型进行仿射,默认值为True。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值