浅谈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实现注册登录系统
Aug 08 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
Python反转序列的方法实例分析
Mar 21 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
python实现简单图片物体标注工具
Mar 18 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
python list多级排序知识点总结
Oct 23 Python
利用python 读写csv文件
Sep 10 Python
如何在pycharm中安装第三方包
Oct 27 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 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 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python代码 输入数字使其反向输出的方法
2018/12/22 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
基于python中__add__函数的用法
2019/11/25 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python解析微信dat文件的方法
2020/11/30 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
新东网科技Java笔试题
2012/07/13 面试题
厂区绿化方案
2014/05/08 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
2016继续教育研修日志
2015/11/13 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
详解Redis瘦身指南
2021/05/26 Redis
用JS实现飞机大战小游戏
2021/06/09 Javascript
利用JavaScript写一个简单计算器
2021/11/27 Javascript