gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 53 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章pytorch 权重weight 与 梯度grad 可视化操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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 hookx = torch.randn(1, requires_grad=True)y = 3*xz = 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 torchfrom torch.autograd import Variableimport torch.nn as nnfrom graphviz import Digraphdef 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 %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 可视化操作的文章就讲到这里了,如果你想了解更多关于pytorch 权重weight 与 梯度grad 可视化操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com