浅谈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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
python实现数组插入新元素的方法
May 22 Python
浅析使用Python操作文件
Jul 31 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
python根据txt文本批量创建文件夹
Dec 08 Python
python如何制作英文字典
Jun 25 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
tensorflow常用函数API介绍
Apr 19 Python
python和anaconda的区别
May 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发电子邮件
2006/10/09 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
python 图像平移和旋转的实例
2019/01/10 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
django迁移文件migrations的实现
2020/03/31 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
会计求职自荐信范文
2015/03/04 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python
Python机器学习之底层实现KNN
2021/06/20 Python