可视化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使用socket向客户端发送数据的方法
Apr 29 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
基于python修改srt字幕的时间轴
Feb 03 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
python构造IP报文实例
May 05 Python
keras 读取多标签图像数据方式
Jun 12 Python
python交互模式基础知识点学习
Jun 18 Python
利用python进行文件操作
Dec 04 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 xml-rpc远程调用
2008/12/19 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
Python程序设计入门(2)变量类型简介
2014/06/16 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
经典c++面试题三
2015/07/08 面试题
外科实习自我鉴定
2013/10/06 职场文书
法人代表证明书
2014/09/18 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
实习感想范文
2015/08/10 职场文书