关于pytorch网络模型可视化函数make_dot的一些问题
发布日期:2021-07-01 03:06:27 浏览次数:2 分类:技术文章

本文共 3799 字,大约阅读时间需要 12 分钟。

关于pytorch网络模型可视化函数make_dot的一些问题

首先,放上make_dot函数的源码(实验室同门给的,出处不详= =)

def make_dot(var, params=None):    """    画出 PyTorch 自动梯度图 autograd graph 的 Graphviz 表示.    蓝色节点表示有梯度计算的变量Variables;    橙色节点表示用于 torch.autograd.Function 中的 backward 的张量 Tensors.    Args:        var: output Variable        params: dict of (name, Variable) to add names to node that            require grad (TODO: make optional)    """    if params is not None:        assert all(isinstance(p, Variable) for p in params.values())        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]) + ')'    output_nodes = (var.grad_fn,) if not isinstance(var, tuple) else tuple(v.grad_fn for v in var)    def add_nodes(var):        if var not in seen:            if torch.is_tensor(var):                # note: this used to show .saved_tensors in pytorch0.2, but stopped                # working as it was moved to ATen and Variable-Tensor merged                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')            elif var in output_nodes:                dot.node(str(id(var)), str(type(var).__name__), fillcolor='darkolivegreen1')            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)    # 多输出场景 multiple outputs    if isinstance(var, tuple):        for v in var:            add_nodes(v.grad_fn)    else:        add_nodes(var.grad_fn)    return dot

这个函数使用方法如下:

graph=make_dot(model_output,params=dict(list(model.named_parameters()))) 第一个参数是模型的输出,第二个是模型的参数先列表化再字典化graph.view('model_structure.pdf','.\\figure\\')  #第一个参数是文件名 第二个是保存路径

可能会出现的问题

problem one

emmm  还是会出现一些问题的= =,因为make_dot要用到graphviz,要注意graphviz的安装方法,不仅在实验环境上要安装,还要在系统里安装,否则就会出现graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpdf', '-O', 'Digraph.gv']graphviz.backend.,make sure the Graphviz executables are on your systems' PATH这样的错误([]里的内容可能不一样,但是问题是一样的,而且都会有'dot'),这里有一个博客总结的很好,

这里要加一句,安装好系统里的呵环境里的之后,一定要重启python内核,至于怎么做到我也不清楚,但是重启电脑一定可以(›´ω`‹ ) ,因为我就是重启电脑之后才work的~

problem two

之后可能还会出现这样的错误ImportError: cannot import name 'PILLOW_VERSION' from 'PIL',这个错误,就是pillow版本太高了,可以使用命令

pip install pillow==6.2.1

或者小于7.0.0的版本都行,但是注意有时候,pip安装不上,那就用conda安装,conda不行就用pip,还有就是编辑器内部的命令行安装以及anaconda的prompt shell,总共有四种组合方式,分别如下:

1.在IDE内部的terminal用conda install
2.在IDE内部的terminal用pip install
3.在anaconda prompt shell 用conda install
4.在anaconda prompt shell 用pip install
有时候你安装好了还报错,就很有可能是没有安装上,这四种方式都要试一下,安装都能出bug,我也很无奈= =

problem three

后面还有可能出现一个问题就是graphviz.backend.CalledProcessError: Command '['dot', '-Tpdf', '-O', 'model_structure.pdf']' returned non-zero exit status 1. [stderr: b'Error: Could not open "modelstructure.pdf.pdf" for writing : Permission denied\r\n'] 类似这种错误,这个实际上是因为你多次调用make_dot,而调用make_dot会将画好的模型图打开,第二次调用就会报写错误,因为打开操作被拒绝,这个问题解决方法很简单,加上判断语句,只调用一次就行了~

就这么多啦,有什么疑问大家可以评论区交流呀!~( ˘•ω•˘ )~

转载地址:https://meteorrain.blog.csdn.net/article/details/104615436 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:关于nn.embedding的维度的定义,函数的理解,一些需要注意的点
下一篇:pytorch神经网络模型会自动初始化嘛?

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月29日 04时03分37秒