可视化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文件及目录操作实例详解
Jun 04 Python
python各种语言间时间的转化实现代码
Mar 23 Python
Python使用sorted排序的方法小结
Jul 28 Python
分享一个简单的python读写文件脚本
Nov 25 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
python 双循环遍历list 变量判断代码
May 04 Python
浅析Python requests 模块
Oct 09 Python
python3访问字典里的值实例方法
Nov 18 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-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
深入解析php中的foreach函数
2013/08/31 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
php获取系统变量方法小结
2015/05/29 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
python自动翻译实现方法
2016/05/28 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
简单了解django缓存方式及配置
2019/07/19 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
Django 返回json数据的实现示例
2020/03/05 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
电子商务专业个人的自我评价
2013/11/19 职场文书
安全标语口号
2014/06/09 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
单独二胎证明
2015/06/24 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
Python基础 括号()[]{}的详解
2021/11/07 Python
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js