浅谈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中__call__用法实例
Aug 29 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
python多进程实现文件下载传输功能
Jul 28 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
python 拼接文件路径的方法
Oct 23 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
Pandas DataFrame求差集的示例代码
Dec 13 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
Python批量将csv文件转化成xml文件的实例
May 10 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python中的Cookie模块如何使用
2020/06/04 Python
Python程序慢的重要原因
2020/09/04 Python
卫生标语大全
2014/06/21 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
学籍证明模板
2014/11/21 职场文书
处级干部考察材料
2014/12/24 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
python使用shell脚本创建kafka连接器
2022/04/29 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android