浅谈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 urlopen()函数 示例分享
Jun 12 Python
Python中str.format()详解
Mar 12 Python
在python中实现对list求和及求积
Nov 14 Python
django-rest-framework 自定义swagger过程详解
Jul 18 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
Python lambda表达式原理及用法解析
Aug 18 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
python 获取字典键值对的实现
Nov 12 Python
python中doctest库实例用法
Dec 31 Python
python3 kubernetes api的使用示例
Jan 12 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的FTP学习(三)
2006/10/09 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
Web程序工作原理详解
2014/12/25 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python GUI实例学习
2017/11/21 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
宿舍使用违章电器检讨书
2014/01/12 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
委托书范本
2014/04/02 职场文书
教师演讲稿大全
2014/05/16 职场文书
研修心得体会
2014/09/04 职场文书
客房领班岗位职责
2015/02/11 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
总结Python变量的相关知识
2021/06/28 Python
MySQL系列之六 用户与授权
2021/07/02 MySQL
Python中rapidjson参数校验实现
2021/07/25 Python