可视化pytorch 模型中不同BN层的running mean曲线实例


Posted in Python onJune 24, 2020

加载模型字典

逐一判断每一层,如果该层是bn 的 running mean,就取出参数并取平均作为该层的代表

对保存的每个BN层的数值进行曲线可视化

from functools import partial
import pickle
import torch
import matplotlib.pyplot as plt

pth_path = 'checkpoint.pth'

pickle.load = partial(pickle.load, encoding="latin1")
pickle.Unpickler = partial(pickle.Unpickler, encoding="latin1")
pretrained_dict = torch.load(pth_path, map_location=lambda storage, loc: storage, pickle_module=pickle)
pretrained_dict = pretrained_dict['state_dict']

means = []
for name, param in pretrained_dict.items():
 print(name)
 if 'running_mean' in name:
  means.append(mean.numpy())

layers = [i for i in range(len(means))]

plt.plot(layers, means, color='blue')
plt.legend()
plt.xticks(layers)
plt.xlabel('layers')
plt.show()

可视化pytorch 模型中不同BN层的running mean曲线实例

补充知识:关于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层的running mean曲线实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python进程管理工具supervisor使用实例
Sep 17 Python
python中Genarator函数用法分析
Apr 08 Python
使用Python脚本生成随机IP的简单方法
Jul 30 Python
Python实现配置文件备份的方法
Jul 30 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
Keras实现将两个模型连接到一起
May 23 Python
Elasticsearch 基本查询和组合查询
Apr 19 Python
python使用shell脚本创建kafka连接器
Apr 29 Python
python3.x中安装web.py步骤方法
Jun 23 #Python
python如何删除文件、目录
Jun 23 #Python
TensorFlow保存TensorBoard图像操作
Jun 23 #Python
python和js交互调用的方法
Jun 23 #Python
virtualenv介绍及简明教程
Jun 23 #Python
python不同系统中打开方法
Jun 23 #Python
自学python用什么系统好
Jun 23 #Python
You might like
php中日期加减法运算实现代码
2011/12/08 PHP
php去除HTML标签实例
2013/11/06 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
PHP反射学习入门示例
2019/06/14 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
python判断windows系统是32位还是64位的方法
2015/05/11 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
实例介绍Python中整型
2019/02/11 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
树莓派实现移动拍照
2019/06/22 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
买房子个人收入证明
2014/10/12 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js