浅谈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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python功能点实现:函数级/代码块级计时器
Jan 02 Python
使用python3构建文件传输的方法
Feb 13 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
Python3 批量扫描端口的例子
Jul 25 Python
python区分不同数据类型的方法
Oct 14 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Django REST framwork的权限验证实例
Apr 02 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
解决中英文字符串长度问题函数
2007/01/16 PHP
用PHP实现的随机广告显示代码
2007/06/14 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中类型检查的详细介绍
2017/02/13 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
Django Form常用功能及代码示例
2020/10/13 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
毕业生的求职信范文分享
2013/12/04 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
远程教育培训心得体会
2016/01/09 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python