浅谈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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python使用剪切板的方法
Jun 06 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
python实现梯度下降算法的实例详解
Aug 17 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
Jquery实现简单的动画效果代码
2012/03/18 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
js取得url地址参数实例
2013/02/22 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
python实现ID3决策树算法
2018/08/29 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Python tkinter模版代码实例
2020/02/05 Python
pandas数据拼接的实现示例
2020/04/16 Python
浅析Python的命名空间与作用域
2020/11/25 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
《秋思》教学反思
2016/02/23 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
python识别围棋定位棋盘位置
2021/07/26 Python
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS