pytorch查看模型weight与grad方式


Posted in Python onJune 24, 2020

在用pdb debug的时候,有时候需要看一下特定layer的权重以及相应的梯度信息,如何查看呢?

1. 首先把你的模型打印出来,像这样

pytorch查看模型weight与grad方式

2. 然后观察到model下面有module的key,module下面有features的key, features下面有(0)的key,这样就可以直接打印出weight了,在pdb debug界面输入p model.module.features[0].weight,就可以看到weight,输入 p model.module.features[0].weight.grad就可以查看梯度信息

pytorch查看模型weight与grad方式

pytorch查看模型weight与grad方式

补充知识:查看Pytorch网络的各层输出(feature map)、权重(weight)、偏置(bias)

BatchNorm2d参数量

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
# 卷积层中卷积核的数量C 
num_features ? C from an expected input of size (N, C, H, W)
>>> import torch
>>> m = torch.nn.BatchNorm2d(100)
>>> m.weight.shape
torch.Size([100])
>>> m.numel()
AttributeError: 'BatchNorm2d' object has no attribute 'numel'
>>> m.weight.numel()
100
>>> m.parameters().numel()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'generator' object has no attribute 'numel'
>>> [p.numel() for p in m.parameters()]
[100, 100]

linear层

>>> import torch
>>> m1 = torch.nn.Linear(100,10)
# 参数数量= (输入神经元+1)*输出神经元
>>> m1.weight.shape
torch.Size([10, 100])
>>> m1.bias.shape
torch.Size([10])
>>> m1.bias.numel()
10
>>> m1.weight.numel()
1000
>>> m11 = list(m1.parameters())
>>> m11[0].shape
# weight
torch.Size([10, 100])
>>> m11[1].shape
# bias
torch.Size([10])

weight and bias

# Method 1 查看Parameters的方式多样化,直接访问即可
model = alexnet(pretrained=True).to(device)
conv1_weight = model.features[0].weight# Method 2 
# 这种方式还适合你想自己参考一个预训练模型写一个网络,各层的参数不变,但网络结构上表述有所不同
# 这样你就可以把param迭代出来,赋给你的网络对应层,避免直接load不能匹配的问题!
for layer,param in model.state_dict().items(): # param is weight or bias(Tensor) 
 print layer,param

feature map

由于pytorch是动态网络,不存储计算数据,查看各层输出的特征图并不是很方便!分下面两种情况讨论:

1、你想查看的层是独立的,那么你在forward时用变量接收并返回即可!!

class Net(nn.Module):
  def __init__(self):
    self.conv1 = nn.Conv2d(1, 1, 3)
    self.conv2 = nn.Conv2d(1, 1, 3)
    self.conv3 = nn.Conv2d(1, 1, 3)  def forward(self, x):
    out1 = F.relu(self.conv1(x))
    out2 = F.relu(self.conv2(out1))
    out3 = F.relu(self.conv3(out2))
    return out1, out2, out3

2、你的想看的层在nn.Sequential()顺序容器中,这个麻烦些,主要有以下几种思路:

# Method 1 巧用nn.Module.children()
# 在模型实例化之后,利用nn.Module.children()删除你查看的那层的后面层
import torch
import torch.nn as nn
from torchvision import modelsmodel = models.alexnet(pretrained=True)# remove last fully-connected layer
new_classifier = nn.Sequential(*list(model.classifier.children())[:-1])
model.classifier = new_classifier
# Third convolutional layer
new_features = nn.Sequential(*list(model.features.children())[:5])
model.features = new_features
# Method 2 巧用hook,推荐使用这种方式,不用改变原有模型
# torch.nn.Module.register_forward_hook(hook)
# hook(module, input, output) -> Nonemodel = models.alexnet(pretrained=True)
# 定义
def hook (module,input,output):
  print output.size()
# 注册
handle = model.features[0].register_forward_hook(hook)
# 删除句柄
handle.remove()# torch.nn.Module.register_backward_hook(hook)
# hook(module, grad_input, grad_output) -> Tensor or None
model = alexnet(pretrained=True).to(device)
outputs = []
def hook (module,input,output):
  outputs.append(output)
  print len(outputs)handle = model.features[0].register_backward_hook(hook)

注:还可以通过定义一个提取特征的类,甚至是重构成各层独立相同模型将问题转化成第一种

计算模型参数数量

def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)

以上这篇pytorch查看模型weight与grad方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之集合(set)
Sep 24 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
pandas重新生成索引的方法
Nov 06 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
python画图把时间作为横坐标的方法
Jul 07 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
详解Scrapy Redis入门实战
Nov 18 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 #Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 #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
You might like
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
JQuery toggle使用分析
2009/11/16 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
餐饮营销方案
2014/02/23 职场文书
竞争上岗实施方案
2014/03/21 职场文书
开学典礼演讲稿
2014/05/23 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
三下乡个人总结
2015/03/04 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
警示教育片观后感
2015/06/17 职场文书
2016国庆促销广告语
2016/01/28 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle