浅谈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 20 Python
使用python实现tcp自动重连
Jul 02 Python
Python中单例模式总结
Feb 20 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
Python实现聊天机器人的示例代码
Jul 09 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
Django程序的优化技巧
Apr 29 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的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python使用gRPC传输协议教程
2018/10/16 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
开业庆典邀请函
2014/01/08 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
战友聚会主持词
2014/04/02 职场文书
七一表彰大会简报
2015/07/20 职场文书
新员工入职感言范文!
2019/07/04 职场文书