浅谈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设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
使用Python对Csv文件操作实例代码
May 12 Python
python实现一组典型数据格式转换
Dec 15 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
python数据挖掘需要学的内容
Jun 23 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
Python常用数据分析模块原理解析
Jul 20 Python
python 如何实现遗传算法
Sep 22 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 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
linux iconv方法的使用
2011/10/01 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
JS中类或对象的定义说明
2014/03/10 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
vue中如何使用ztree
2018/02/06 Javascript
详解Node 定时器
2018/02/26 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
Python中的集合类型知识讲解
2015/08/19 Python
Python选课系统开发程序
2016/09/02 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python下载库的步骤方法
2019/10/12 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
集团薪酬管理制度
2014/01/13 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书