浅谈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类定义和类继承详解
May 08 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
编写Python CGI脚本的教程
Jun 29 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Python登录系统界面实现详解
Jun 25 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
python文件操作的简单方法总结
Nov 07 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
Python语言中的数据类型-序列
Feb 24 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针对数字的加密解密类
2014/03/20 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
jquery 根据name名获取元素的value值
2015/02/27 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
python实现猜单词小游戏
2020/05/22 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
办公自动化专业大学生职业规划书
2014/03/06 职场文书
《雪儿》教学反思
2014/04/17 职场文书
党性分析材料格式
2014/12/19 职场文书
2014年政教处工作总结
2014/12/20 职场文书
道德模范事迹材料
2014/12/20 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
交通事故被告代理词
2015/05/23 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android