浅谈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求素数示例分享
Feb 16 Python
Python的Flask框架中web表单的教程
Apr 20 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Python中的Django基本命令实例详解
Jul 15 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
virtualenv介绍及简明教程
Jun 23 Python
用Python生成会跳舞的美女
Jan 18 Python
python中mongodb包操作数据库
Apr 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
PHP生成带有雪花背景的验证码
2008/09/28 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
python中argparse模块用法实例详解
2015/06/03 Python
Python中常见的数据类型小结
2015/08/29 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
Python 编程速成(推荐)
2019/04/15 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
django从后台返回html代码的实例
2020/03/11 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
python 6行代码制作月历生成器
2020/09/18 Python
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
《金子》教学反思
2014/04/13 职场文书
应届生求职信范文
2014/05/26 职场文书
会计求职信怎么写
2015/03/20 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
全民创业工作总结
2015/08/13 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang