浅谈pytorch中的BN层的注意事项


Posted in Python onJune 23, 2020

最近修改一个代码的时候,当使用网络进行推理的时候,发现每次更改测试集的batch size大小竟然会导致推理结果不同,甚至产生错误结果,后来发现在网络中定义了BN层,BN层在训练过程中,会将一个Batch的中的数据转变成正太分布,在推理过程中使用训练过程中的参数对数据进行处理,然而网络并不知道你是在训练还是测试阶段,因此,需要手动的加上,需要在测试和训练阶段使用如下函数。

model.train() or model.eval()

BN类的定义见pytorch中文参考文档

补充知识:关于pytorch中BN层(具体实现)的一些小细节

最近在做目标检测,需要把训好的模型放到嵌入式设备上跑前向,因此得把各种层的实现都用C手撸一遍,,,此为背景。

其他层没什么好说的,但是BN层这有个小坑。pytorch在打印网络参数的时候,只打出weight和bias这两个参数。咦,说好的BN层有四个参数running_mean、running_var 、gamma 、beta的呢?一开始我以为是pytorch把BN层的计算简化成weight * X + bias,但马上反应过来应该没这么简单,因为pytorch中只有可学习的参数才称为parameter。上网找了一些资料但都没有说到这么细的,毕竟大部分用户使用时只要模型能跑起来就行了,,,于是开始看BN层有哪些属性,果然发现了熟悉的running_mean和running_var,原来pytorch的BN层实现并没有不同。这里吐个槽:为啥要把gamma和beta改叫weight、bias啊,很有迷惑性的好不好,,,

扯了这么多,干脆捋一遍pytorch里BN层的具体实现过程,帮自己理清思路,也可以给大家提供参考。再吐槽一下,在网上搜“pytorch bn层”出来的全是关于这一层怎么用的、初始化时要输入哪些参数,没找到一个pytorch中BN层是怎么实现的,,,

众所周知,BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。

以上这篇浅谈pytorch中的BN层的注意事项就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单上手Python中装饰器的使用
Jul 12 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
Python selenium如何设置等待时间
Sep 15 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
python中单下划线_的常见用法总结
Jul 10 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
Python 创建守护进程的示例
Sep 29 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 #Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 #Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 #Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 #Python
python2和python3哪个使用率高
Jun 23 #Python
python使用QQ邮箱实现自动发送邮件
Jun 22 #Python
浅谈keras中loss与val_loss的关系
Jun 22 #Python
You might like
php 面向对象的一个例子
2011/04/12 PHP
PHP安全配置详细说明
2011/09/26 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP多态代码实例
2015/06/26 PHP
js Function类型
2011/12/04 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Django model select的多种用法详解
2019/07/16 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python中SQLite如何使用
2020/05/27 Python
python如何将图片转换素描画
2020/09/08 Python
python 数据类型强制转换的总结
2021/01/25 Python
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
销售人员职业生涯规划范文
2014/03/01 职场文书
年终晚会活动方案
2014/08/21 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
投标单位介绍信
2015/05/05 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
闪闪红星观后感
2015/06/08 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书