pytorch 权重weight 与 梯度grad 可视化操作

作者:rainbow_lucky0106 时间:2021-02-15 22:42:20 

pytorch 权重weight 与 梯度grad 可视化

查看特定layer的权重以及相应的梯度信息

打印模型

pytorch 权重weight 与 梯度grad 可视化操作

观察到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 就可以查看梯度信息。

中间变量的梯度 : .register_hook

pytorch 为了节省显存,在反向传播的过程中只针对计算图中的叶子结点(leaf variable)保留了梯度值(gradient)。但对于开发者来说,有时我们希望探测某些中间变量(intermediate variable) 的梯度来验证我们的实现是否有误,这个过程就需要用到 tensor的register_hook接口


grads = {}
def save_grad(name):
   def hook(grad):
       grads[name] = grad
   return hook
x = torch.randn(1, requires_grad=True)
y = 3*x
z = y * y
# 为中间变量注册梯度保存接口,存储梯度时名字为 y。
y.register_hook(save_grad('y'))
# 反向传播
z.backward()
# 查看 y 的梯度值
print(grads['y'])

打印网络回传梯度

net.named_parameters()

parms.requires_grad 表示该参数是否可学习,是不是frozen的;

parm.grad 打印该参数的梯度值。


net = your_network().cuda()
def train():
...
outputs = net(inputs)
   loss = criterion(outputs, targets)
   loss.backward()
for name, parms in net.named_parameters():
 print('-->name:', name, '-->grad_requirs:',parms.requires_grad, \
  ' -->grad_value:',parms.grad)

查看pytorch产生的梯度


[x.grad for x in self.optimizer.param_groups[0]['params']]

pytorch模型可视化及参数计算

我们在设计完程序以后希望能对我们的模型进行可视化,pytorch这里似乎没有提供相应的包直接进行调用,下面把代码贴出来:


import torch
from torch.autograd import Variable
import torch.nn as nn
from graphviz import Digraph
def make_dot(var, params=None):

if params is not None:
       assert isinstance(params.values()[0], Variable)
       param_map = {id(v): k for k, v in params.items()}

node_attr = dict(style='filled',
                    shape='box',
                    align='left',
                    fontsize='12',
                    ranksep='0.1',
                    height='0.2')
   dot = Digraph(node_attr=node_attr, graph_attr=dict(size="12,12"))
   seen = set()

def size_to_str(size):
       return '('+(', ').join(['%d' % v for v in size])+')'

def add_nodes(var):
       if var not in seen:
           if torch.is_tensor(var):
               dot.node(str(id(var)), size_to_str(var.size()), fillcolor='orange')
           elif hasattr(var, 'variable'):
               u = var.variable
               name = param_map[id(u)] if params is not None else ''
               node_name = '%s\n %s' % (name, size_to_str(u.size()))
               dot.node(str(id(var)), node_name, fillcolor='lightblue')
           else:
               dot.node(str(id(var)), str(type(var).__name__))
           seen.add(var)
           if hasattr(var, 'next_functions'):
               for u in var.next_functions:
                   if u[0] is not None:
                       dot.edge(str(id(u[0])), str(id(var)))
                       add_nodes(u[0])
           if hasattr(var, 'saved_tensors'):
               for t in var.saved_tensors:
                   dot.edge(str(id(t)), str(id(var)))
                   add_nodes(t)
   add_nodes(var.grad_fn)
   return dot

我们在我们的模型下面直接进行调用就可以了,例如:


if __name__ == "__main__":
   model = DeepLab(backbone='resnet', output_stride=16)
   input = torch.rand(1, 3, 53, 53)
   output = model(input)
   g = make_dot(output)
   g.view()
   params = list(net.parameters())
   k = 0
   for i in params:
       l = 1
       print("该层的结构:" + str(list(i.size())))
       for j in i.size():
           l *= j
       print("该层参数和:" + str(l))
       k = k + l
   print("总参数数量和:" + str(k))

模型部分可视化结果:

pytorch 权重weight 与 梯度grad 可视化操作

参数计算:

pytorch 权重weight 与 梯度grad 可视化操作

来源:https://blog.csdn.net/qq_21980099/article/details/106329354

标签:pytorch,weight,grad
0
投稿

猜你喜欢

  • php 生成短网址原理及代码

    2023-10-23 05:04:25
  • matplotlib共享坐标轴的实现(X或Y坐标轴)

    2023-12-01 23:58:12
  • python 高效去重复 支持GB级别大文件的示例代码

    2022-06-18 09:39:48
  • Sun正式发布MySQL 5.1版 简化数据库应用

    2008-12-11 15:15:00
  • OpenCV清除小面积连通域的实现方法

    2023-11-16 03:58:25
  • Django filter动态过滤与排序实现过程解析

    2022-01-07 18:16:54
  • Python实现字符串匹配的KMP算法

    2021-02-10 05:03:45
  • 使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列

    2012-07-11 15:34:35
  • python数字类型和占位符详情

    2022-10-03 06:36:32
  • SQL Server 2005 SSIS技巧:动态目的文件名

    2008-12-05 15:47:00
  • JavaScript的事件代理比你想的要简单

    2009-04-27 12:40:00
  • DW MX 的快键一览表

    2009-07-21 12:47:00
  • Python Celery异步任务队列使用方法解析

    2023-05-18 02:34:53
  • 优化Python代码使其加快作用域内的查找

    2021-09-25 06:40:13
  • 利用django和mysql实现一个简单的web登录页面

    2024-01-13 18:16:16
  • Python实现字典去除重复的方法示例

    2021-02-24 21:52:14
  • 最基础的Python的socket编程入门教程

    2022-10-13 03:38:46
  • Git如何恢复到之前版本

    2022-11-26 05:24:21
  • 如何通过pycharm实现对数据库的查询等操作(非多步操作)

    2024-01-25 03:31:37
  • 最具创意的广告牌全集

    2007-09-21 19:54:00
  • asp之家 网络编程 m.aspxhome.com