• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    pytorch 权重weight 与 梯度grad 可视化操作

    pytorch 权重weight 与 梯度grad 可视化

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

    打印模型

    观察到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 模型中不同BN层的running mean曲线实例
    • pytorch使用tensorboardX进行loss可视化实例
    • pytorch对梯度进行可视化进行梯度检查教程
    • pytorch实现mnist数据集的图像可视化及保存
    • 使用pytorch实现可视化中间层的结果
    • pytorch 可视化feature map的示例代码
    • pytorch 模型可视化的例子
    • Pytorch可视化的几种实现方法
    上一篇:PyTorch 如何检查模型梯度是否可导
    下一篇:pytorch 梯度NAN异常值的解决方案
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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