浅谈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实现带百分比的进度条
Jun 28 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
python操作kafka实践的示例代码
Jun 19 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 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
php5 mysql分页实例代码
2008/04/10 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
phpinfo的知识点总结
2019/10/10 PHP
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
Python3基于sax解析xml操作示例
2018/05/22 Python
django_orm查询性能优化方法
2018/08/20 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
Python pandas用法最全整理
2019/08/04 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
python打包多类型文件的操作方法
2020/09/21 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
商场活动策划方案
2014/01/24 职场文书
施工安全汇报材料
2014/08/17 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
学校远程教育工作总结
2015/08/11 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers