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

本文详细介绍使用PyTorch的make_dot函数进行网络模型可视化的步骤及常见问题解决方法,包括环境配置、依赖库版本控制及多输出场景下的图形生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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会将画好的模型图打开,第二次调用就会报写错误,因为打开操作被拒绝,这个问题解决方法很简单,加上判断语句,只调用一次就行了~

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

<think>好的,用户想了解在PyTorch中如何实现模型可视化,包括功能、方法、工具和示例。首先,我需要回忆一下PyTorch相关的可视化工具。记得之前有听说过PyTorchViz这个库,还有torchviz,可能用户提到的VisualTorch也是一个类似的库。需要确认这些工具的具体使用方法和区别。 首先,用户的问题中提到引用[1]和[2],里面提到了VisualTorch和PyTorchViz,这两个应该是不同的工具。PyTorchViz的make_dot函数可以生成计算图,而VisualTorch可能更侧重于模型架构的可视化。需要分别解释这两个工具的使用步骤,并提供代码示例。 接下来,我应该整理出几种不同的方法,比如使用PyTorchViz进行动态计算图的可视化,使用torchsummary或torchinfo来显示模型结构,以及使用TensorBoard集成。此外,VisualTorch作为另一个工具,也应该被包含进去,但需要确认它是否真实存在,或者是否是用户引用中的笔误。比如,用户提到的引用[1]中的VisualTorch可能是指某个特定的库,但实际在PyTorch生态中,可能更常用的是torchviz或者Netron这样的工具。 还需要考虑用户可能的实际需求,比如模型结构的直观展示、计算图的查看、参数统计等。不同的工具适合不同的场景,比如torchsummary适合快速查看各层参数,而TensorBoard适合训练过程中的可视化。 另外,代码示例需要正确,比如使用PyTorchViz时,需要导入make_dot,然后生成计算图并渲染。对于模型结构,使用torchsummary的summary函数。TensorBoard需要安装并启动,然后添加代码来记录模型结构。 需要注意的是,确保所有的LaTeX公式都正确使用$...$或$$...$$格式,例如变量名或数学表达式。同时,回答要结构清晰,分点说明每种方法,并附上示例代码和相关引用。 最后,生成的相关问题需要与模型可视化相关,可能涉及工具比较、动态图与静态图的区别,或者可视化在调试中的应用等。这些问题应该能帮助用户进一步探索该主题。</think>在PyTorch中实现模型可视化主要有以下几种方法和工具,结合代码示例说明如下: --- ### 1. **使用`torchviz`生成动态计算图** 通过`torchviz`库可可视化模型前向传播的计算图,适用于调试复杂模型结构。 ```python import torch from torchviz import make_dot # 定义模型 model = torch.nn.Sequential( torch.nn.Linear(10, 5), torch.nn.ReLU(), torch.nn.Linear(5, 1) ) # 生成计算图 x = torch.randn(1, 10) out = model(x) graph = make_dot(out, params=dict(model.named_parameters())) graph.render("model_graph", format="png") # 输出为PNG文件 ``` 此代码生成的计算图会展示张量形状、操作类型和梯度流向[^2]。 --- ### 2. **使用`torchsummary`显示模型结构** `torchsummary`可输出模型各层的参数统计信息,适合快速查看层间连接。 ```python from torchsummary import summary model = torch.nn.Sequential( torch.nn.Conv2d(3, 16, kernel_size=3), torch.nn.MaxPool2d(2), torch.nn.Flatten(), torch.nn.Linear(16*14*14, 10) ) summary(model, input_size=(3, 28, 28)) # 输入尺寸需匹配实际数据 ``` 输出结果包含每层的输出形状和参数量,便于分析模型复杂度。 --- ### 3. **TensorBoard集成可视化** PyTorch内置的TensorBoard支持训练过程跟踪和模型结构可视化。 ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter("runs/experiment") model = torch.nn.LSTM(input_size=100, hidden_size=50, num_layers=2) input_data = torch.randn(32, 10, 100) # (batch, seq, features) # 添加模型结构到TensorBoard writer.add_graph(model, input_data) writer.close() ``` 运行后通过`tensorboard --logdir=runs`启动Web界面查看计算图。 --- ### 4. **Netron工具查看模型文件** 将PyTorch模型导出为ONNX格式后,用Netron工具交互式查看: ```python dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "model.onnx") ``` 在[Netron官网](https://netron.app/)上传`.onnx`文件即可显示层间连接与参数细节。 --- ### 5. **VisualTorch库(第三方工具)** 如引用[1]所述,VisualTorch提供更简洁的架构图生成: ```python from visualtorch import draw_graph draw_graph(model, input_shape=(1, 3, 224, 224), save_path="model_arch.png") ``` 该工具自动布局各层,适合论文或文档中的示意图生成[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值