可视化工具:Graphiz、Netron、ZetaneEngine
Graphiz是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形,使用它可以非常方便地对任何图形进行可视化。
Graphiz的使用步骤包括创建图,添加节点与边,渲染图,下面是一个简单的案例。
import graphviz
#创建图
dot = graphviz.Digraph(comment = 'example')
#添加节点与边
dot. node('A', 'leader')
dot. node('B', 'chargeman')
dot. node('C', 'member')
dot. node('D', 'member')
dot.edges(['AB', 'AC', 'AD', 'BC', 'BD'])
#渲染图
dot.render('test-output/team.gv', view = True)
可视化结果如图7.2所示。
下面我们使用Graphiz对模型结构进行可视化,核心代码如下:
# coding: utf8
import torch
import torch. nn as nn
import torch. nn. functional as F
from torch.autograd import Variable
import numpy as np
#使用Graphiz进行PyTorch网络结构可视化
def make_dot(var, params = None):
#将PyTorch autograd graph生成Graphiz图
# var:输出变量
# params:用于添加节点的字典
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',
fontsi ze ='12',
rankse p ='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\n %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_':
x =torch.randn(1,3,48,48)
model =simpleconv3(2)
y =model(x)
g =make_dot(y)
g.view()
对上面模型结构进行可视化的结果如图7.3所示
对于PyTorch模型,我们可以直接载入PT格式的权重文件进行可视化,但是更好的做法是将其先转换为ONNX 格式,转换代码如下:
import torch
from net import simpleconvs
mynet =simpleconvis(2)
mynet.load_state_dict(torch.load('mode1.pt',map_location=lambda storage,loc:storage))
mynet.train(False)
dummy_input =torch.randn((1,3,48,48))
torch.onnx.export(mynet,dummy_input,"model.onnx",verbose=False)
通过可视化模型结构,我们对需要训练的网络有了整体的了解,修改代码后可以查看模型结构的变化情况,从而检查是否符合设计的目的,这在训练大模型与小模型时都是非常实用的技术。
如果输入的是训练好的权重文件,则可以直接查看每一个网络层的权重,通过一键导出参数为NPY 文件,可以简单统计权重的分布。
如图7.5所示为模型的权重统计结果,横坐标表示幅值大小,纵坐标表示比例,总共分为100个bin,统计范围为-2∼2。可以看出,大部分的值都非常接近于0,这说明模型有很好的稀疏性。
网络浅层/底层 | 深层 | 越深层 | |
---|---|---|---|
学习到的特征 | 边缘 | 目标形状 | 语义级别的目标 |
感受野 | 越小,看到的就是越局部的信息 | 越大,看到的就是越全局的信息,学习到的知识越抽象 |
摘要:3D可视化工具ZetaneEngine,可视化网络中任何一层的特征图。特征图的展示方式比较丰富,支持二维图、三维图和数值直方图。图7.9和图7.10是可视化的例子
为了方便查看模型的参数及特征,有许多研究者都开发过相关的工具,这里介绍一个功能比较完善的工具,那就是由加拿大蒙特利尔一家公司开发的一个3D可视化工具ZetaneEngine。
上传一个模型和数据,该工具可以可视化网络中任何一层的特征图,特征图的展示方式比较丰富,支持二维图、三维图和数值直方图,下面就是对上一节中ONNX格式模型的可视化界面图。
图7.9展示了对输入数据的可视化结果,UserInput表示输入,可以看到,左侧图像原始大小为(RGB的三个通道分别用灰度图展示,而模型的输入张量大小为右上方展示了对所有灰度值的直方图统计,最大像素灰度值为255,最小像素灰度值为24,平均像素灰度值为155,右下方则通过伪彩色的方式显示了输入的一个通道。
图7.10展示了对卷积层特征的可视化结果,输出特征图大小为1×12×23×23,,左侧展示了平铺的一些特征图,右下方则展示了3D的视角。
参考文献:
《深度学习之图像识别 核心算法与实战案例 (全彩版)》 言有三 著
出版社:清华大学出版社
出版时间:2023年7月第一版(第一次印刷)
ISBN:978-7-302-63527-7