PyTorch神经网络的可视化踩坑

文章目录

    • 1. 网络结构可视化
      • 1.1 使用netron可视化工具(对PyTorch的支持较差)
      • 1.1.1 常规思路: 将模型导出成.pth文件(坑)
      • 1.1.2 曲线救国: 将模型导出成 .onnx 文件(坑)
      • 1.1.3 天降猛男: 将模型导出成 torchscript (好用)
      • 1.2 使用 graphviz
    • 2. 神经网络图可视化
      • 2.1 使用 dotnets 脚本
      • 2.2 使用在线工具调
      • 2.3 MATLAB (仍在坑中)

1. 网络结构可视化

参考资料: https://www.freesion.com/article/340667237/

1.1 使用netron可视化工具(对PyTorch的支持较差)

GitHub: https://github.com/lutzroeder/netron

不同平台的安装包下载地址:https://github.com/lutzroeder/netron/releases/tag/v4.9.5。

(1)可以在macOS、Linux、Windows等主流操作系统上运行,还有网页版(http://netron.app)。

(2)支持多种主流的深度学习框架,比如ONNX、Keras、Tensorflow Lite、Caffe/Caffe2、Darknet、MNN、ncnn、PaddlePaddle等;对于Tensorflow、Pytorch等框架正在适配中,有测试版本可用。

1.1.1 常规思路: 将模型导出成.pth文件(坑)

  1. 首先将 PyTorch 网络保存成 .pth 文件
import torch
torch.save(net, "my_model.pth") # 这里的net即为你的网络
  1. 使用 netron 导入 my_model.pth 后即可看到成品

坑: 光有结构, 没有标识箭头

1.1.2 曲线救国: 将模型导出成 .onnx 文件(坑)

  1. 首先将 PyTorch 网络保存成 .onnx 文件
torch.onnx.export(net, train_x, "res.onnx", export_params=True, verbose=True, training=False)
  1. 使用 netron 导入 res.onnx 后即可看到成品

坑: 结构有, 箭头有, 标识错误

1.1.3 天降猛男: 将模型导出成 torchscript (好用)

  1. 导出成 .pt 文件, 下面两个都可以用, 都试一下.
traced_script_module = torch.jit.trace(net,train_x)
# 保存模型
traced_script_module.save("model-script.pt")
traced_script_module = torch.jit.script(net)

# 保存模型
traced_script_module.save("model-script2.pt")
  1. 使用 netron 导入 model-script.ptmodel-script2.pt 后即可看到成品

1.2 使用 graphviz

先去 graphviz 官网 下载安装包安装

然后安装这两个依赖包:

pip install graphviz  # 安装graphviz
pip install git+https://github.com/szagoruyko/pytorchviz  # 通过git安装torchviz
  1. 加载并运行一个模型
import torch
from torchvision.models import AlexNet
from torchviz import make_dot
 
x=torch.rand(8,3,256,512)
model=AlexNet()
y=model(x)
  1. 调用make_dot()函数构造图对象(三种方式)
g = make_dot(y)
g = make_dot(y, params=dict(model.named_parameters()))
g = make_dot(y, params=dict(list(model.named_parameters()) + [('x', x)]))
  1. 保存模型,以PDF格式保存(两种方式)
# g.view() # 会生成一个 Digraph.gv.pdf 的PDF文件 (文件名固定)
g.render('espnet_model', view=False) # 会自动保存为一个 espnet.pdf,第二个参数为True,则会自动打开该PDF文件,为False则不打开

2. 神经网络图可视化

参考资料: https://zhuanlan.zhihu.com/p/148896017

2.1 使用 dotnets 脚本

GitHub: https://github.com/martisak/dotnets

# Inspired by
# https://tgmstat.wordpress.com/2013/06/12/draw-neural-network-diagrams-graphviz/

# UPDATE HISTORY
# April, 2018 - 2to3 - Madhavun Candadai

# layers = [3, 5, 5, 5, 2]
layers = [3, 6, 6, 2]
hidden_len = 2

layers_str = ["Input"] + ["Hidden"] * hidden_len   + ["Output"]
layers_col = ["none"] + ["none"] * hidden_len   + ["none"]
layers_fill = ["black"] + ["gray"] * hidden_len  + ["black"]

penwidth = 15
font = "Cambria 10"

print("digraph G {")
# print("\tfontname = \"{}\"".format(font))
print("\trankdir=LR")
print("\tsplines=line")
print("\tnodesep=.08;")
print("\tranksep=1;")
print("\tedge [color=black, arrowsize=.5];")
print("\tnode [fixedsize=true,label=\"\",style=filled," + \
    "color=none,fillcolor=gray,shape=circle]\n")

# Clusters
for i in range(0, len(layers)):
    print(("\tsubgraph cluster_{} {{".format(i)))
    print(("\t\tcolor={};".format(layers_col[i])))
    print(("\t\tnode [style=filled, color=white, penwidth={},"
          "fillcolor={} shape=circle];".format(
              penwidth,
              layers_fill[i])))

    print(("\t\t"), end=' ')

    for a in range(layers[i]):
        print("l{}{} ".format(i + 1, a), end=' ')

    print(";")
    print(("\t\tlabel = {};".format(layers_str[i])))

    print("\t}\n")

# Nodes
for i in range(1, len(layers)):
    for a in range(layers[i - 1]):
        for b in range(layers[i]):
            print("\tl{}{} -> l{}{}".format(i, a, i + 1, b))

print("}")

生成 pdf 的命令:

python dotnets.py | dot -Tpdf > test.pdf

2.2 使用在线工具调

http://alexlenail.me/

2.3 MATLAB (仍在坑中)

需要在PyTorch上将神经网络模型转成.onnx文件
然后再用matlab导入
遂使用此脚本

modelfile = 'res.onnx';
classes = ["neg" "pos"];
net = importONNXNetwork(modelfile,'OutputLayerType','classification','Classes',classes)

然而报错

错误使用 importONNXNetwork (47)
importONNXNetwork 需要 Deep Learning Toolbox Converter for ONNX Model Format 支持包。要安装此支持包,请使用附加功能资源管理
器。

点击下载时,提示登录邮箱(我用的matlab是破解版)。没办法,抱着试一试的心态注册了一个号,结果是顺利将额外的包安上了。

再次输入代码,报错:

错误使用 nnet.internal.cnn.onnx.translateONNX>createInputLayer (440)
Only image inputs are supported for import.

出错 nnet.internal.cnn.onnx.translateONNX (58)
        inputLayer = createInputLayer(thisGraph, inputsWithoutInitializers{i}, UserImageInputSize);

出错 nnet.internal.cnn.onnx.importONNXNetwork (11)
[LayersOrGraph, translationIssues]      = nnet.internal.cnn.onnx.translateONNX(modelProto, OutputLayerType,
UserImageInputSize, true);

出错 importONNXNetwork (52)
Network = nnet.internal.cnn.onnx.importONNXNetwork(modelfile, varargin{:});

https://ww2.mathworks.cn/matlabcentral/answers/501080-error-loading-onnx-model-exported-from-pytorch-to-matlab

P.S. 听说可以将 PyTorch 转换成 MATLAB代码 ↓

https://github.com/albanie/mcnPyTorch

你可能感兴趣的:(编码经验,pytorch,神经网络,深度学习)