想要对一个深度学习模型有最直观的了解那就是直接可视化其网络结构,常见的网络可视化工具有很多,今天就自己了解的进行简单的总结,
tensorflow的模型结构可视化方法:
(1)使用自带的tensorboard(需要自己在代码中加入节点信息)
(2)使用netron工具打开(.pd 或者是.meta文件)
(3)第三方库CNNGraph( https://github.com/huachao1001/CNNGraph)
(4)tensorspace.js (没用过)
(5)高层API中keras的可视化
pytorch的模型结构可视化方法:
(1)使用tensorboardX(同tensorflow)
(2)使用graphviz加上torchviz (依赖于graphviz和GitHub第三方库torchviz)
(3)使用微软的tensorwatch (只能在jupyter notebook中使用)
(4)使用netron可视化工具(.pt 或者是 .pth 文件)
Mxnet模型可视化
(1)graphviz
(2)自带的mxboard
(3)使用netron可视化工具
import mxnet as mx
from mxnet.gluon import loss as gloss,data as gdata,nn,utils as gutils
import os
os.environ["PATH"] += os.pathsep + 'D:\\anaconda\\content\\Library\\bin\\graphviz\\release\\bin' ##需要先下载好graphviz
# 定义网络(gluon api)
net = nn.Sequential()
with net.name_scope():
net.add(nn.Dense(128, activation='relu'))
net.add(nn.Dense(64, activation='relu'))
net.add(nn.Dense(10))
# gluon api实现的图,必须先用symbol初始化一下,注意,这个操作在进行训练的时候是不需要的
input_symbol = mx.symbol.Variable('input_data')
net = net(input_symbol)
# 绘图
mx.viz.plot_network(net)
结果如下,
通过HiddenLayer可视化网络
import torch
import torch.nn as nn
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(1, 16, 3, 1, 1),
nn.ReLU(),
nn.AvgPool2d(2, 2)
)
self.conv2 = nn.Sequential(
nn.Conv2d(16, 32, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.fc = nn.Sequential(
nn.Linear(32 * 7 * 7, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU()
)
self.out = nn.Linear(64, 10)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
output = self.out(x)
return output
MyConvNet = ConvNet()
print(MyConvNet)
###先确保安装了hiddelayer库,pip install hiddenlayer
import hiddenlayer as h
vis_graph = h.build_graph(MyConvNet, torch.zeros([1 ,1, 28, 28])) # 获取绘制图像的对象
vis_graph.theme = h.graph.THEMES["blue"].copy() # 指定主题颜色
vis_graph.save("./demo1.png") # 保存图像的路径
效果如下:
通过PyTorchViz可视化网络
先安装库:
pip install torchviz
这里我们只使用可视化函数make_dot()
来获取绘图对象,基本使用和HiddenLayer
差不多,不同的地方在于PyTorch
绘图之前可以指定一个网络的输入值和预测值。
from torchviz import make_dot
x = torch.randn(1, 1, 28, 28).requires_grad_(True) # 定义一个网络的输入值
y = MyConvNet(x) # 获取网络的预测值
MyConvNetVis = make_dot(y, params=dict(list(MyConvNet.named_parameters()) + [('x', x)]))
MyConvNetVis.format = "png"
# 指定文件生成的文件夹
MyConvNetVis.directory = "data"
# 生成文件
MyConvNetVis.view()
打开与上述代码相同根目录下的data文件夹,里面会有一个.gv
文件和一个.png
文件,其中的.gv
文件是Graphviz工具生成图片的脚本代码,.png
是.gv
文件编译生成的图片,直接打开.png
文件就行。
Netron(支持tf, caffe, keras,mxnet等多种框架):
支持的框架support for: ONNX (.onnx, .pb, .pbtxt), Keras (.h5, .keras), CoreML (.mlmodel), Caffe2 (predict_net.pb, predict_net.pbtxt), MXNet (.model, -symbol.json) TensorFlow Lite (.tflite). | experimental support for : Caffe (.caffemodel, .prototxt), PyTorch (.pth), Torch (.t7), CNTK (.model, .cntk), PaddlePaddle (model), Darknet (.cfg), scikit-learn (.pkl), TensorFlow.js (model.json, .pb) TensorFlow (.pb, .meta, .pbtxt). |
该工具有在线模式和离线模式两种,在线的可以访问该网站
https://lutzroeder.github.io/netron/
然后输入自己的模型即可,也可以通过运行脚本,然后输入本地网址映射
import netron
modelPath = "googlenet.pb"
netron.start(modelPath) ###运行该脚本会提示打开http://localhost:8080即可
第二种方式可以尝试下载app,链接如下
https://github.com/lutzroeder/netron
神经网络模型可视化的方法还有很多,学习之路,其修远兮,吾等将上下而求索!
参考链接:
https://www.freesion.com/article/340667237/(PYTORCH 网络结构可视化方法汇总(三种实现方法详解))
https://blog.csdn.net/qqqzmy/article/details/86060131(轻量好用的神经网络模型可视化工具netron)
http://www.cxyzjd.com/article/weixin_39671631/110978200(pytorch打印网络结构)