"画一张神经网络结构图,有时候比训一个模型还费劲。" 这话我一点没夸张。前段时间帮一个做图像分类的朋友看投稿,模型本身没问题,卡在配图上:他用演示文稿拼了个卷积神经网络结构图,方块边距靠肉眼凑,导出后一放大全是锯齿,审稿意见一句 "poor figure quality" 就把稿子退回重画。类似的事在科研和工程圈太普遍了——神经网络跑通了,绘图软件反倒成了最后一道坎。这篇就把我这些年折腾过的相关工具做一次彻底梳理:哪些用来画网络结构图,哪些用来画训练曲线和拟合结果,哪些其实是拿神经网络来做图的(比如常见的 AI 滤镜类工具),各自适合什么场景、有什么坑,一次讲清。不管你是刚入门的本科生,还是要交论文的硕士博士,或者是要做技术汇报的工程师,都能在这里找到可以直接抄作业的组合。
1. 先把需求分清:你要的是"画网络"还是"用网络画"
很多人搜"神经网络绘图软件"的时候,其实自己都没想清楚要什么。我一共被问过三种完全不同的需求,结果对方张口都是同一个词。需求不先拆开,后面选什么工具都是错的。
1.1 一个标题下藏着的三类需求
第一类是画网络结构示意图。就是论文里那种"输入层→卷积层→池化层→全连接层→输出层"的框图,有时候还要画成 3D 立体的,像 LeNet5、卷积神经网络那种经典构图。这类需求的关键词是"结构图""architecture""框架图",输出物是一张能放进论文的静态示意图,跟模型跑不跑没关系,模型是假的也能画。
第二类是画实验结果数据图。训练损失曲线、准确率曲线、BP神经网络拟合曲线、混淆矩阵、类别分布……这些是把跑出来的数字画成折线图、散点图、柱状图。这类需求的关键词是"拟合曲线""loss curve""科研绘图",本质上是数据可视化,跟网络结构一点关系没有,用 matplotlib 就能搞定,跟 CNN 还是 RNN 无关。
第三类是用神经网络来生成/处理图像。像各种 AI 滤镜、风格迁移、图像上色、超分辨率,这一类是"神经网络作为画图工具",不是"画神经网络的工具"。搜热词里那个"ai神经网络滤镜如何使用"就是这一类的典型。前两类是科研需求,第三类是创作需求,工具池完全不重叠。
1.2 别再拿错的工具硬凑:选型先看输出物
拆完需求,接下来定输出物。这一步直接决定工具选择,我见过太多人拿截图当配图,最后返工的。要点就三条。
第一,矢量还是位图。期刊和会议基本都要求矢量图(PDF、EPS、SVG)或者至少 300 dpi 以上的高分辨率位图。演示文稿截图、网页截图一般是 72 到 96 dpi 的位图,放大就糊,这是最常被打回的原因。
第二,能不能再编辑。论文改来改去是常态,图层、文字、箭头要能单独调。TikZ、Origin、Illustrator 这类工具输出的图可以随时回去改,而一次成型的位图就只能重画。
第三,配色和字体是否统一。论文里一套图的字体、线宽、配色应该一致,这要求工具的样式可控。散着用好几个工具画,最后拼在一起风格打架,评审一眼就能看出来。
下面这张表可以先建立整体印象,后面几节再逐个展开。
| 需求类型 | 典型输出物 | 推荐工具方向 | 常见误区 |
|---|---|---|---|
| 网络结构示意图 | 层次框图、3D 立体结构图 | NN-SVG、PlotNeuralNet、Netron、draw.io | 用真模型截图,模糊且不可编辑 |
| 实验数据图 | 拟合曲线、损失曲线、柱状图 | matplotlib、seaborn、MATLAB、Origin | 用 Excel 默认样式,配色难看 |
| 用网络生成图像 | 风格化、滤镜、上色图 | 图像生成类工具 | 拿它去画结构框图,方向错位 |
2. 网络结构图工具实测:从网页一键出图到 LaTeX 精修
结构图这一类需求最刚,也最容易踩坑。我的经验是按"要不要立体感""愿不愿意写代码""手上有没有现成模型文件"三个问题来分岔。下面四个工具基本能覆盖 90% 的场景。
2.1 NN-SVG:结构示意图的应急首选
NN-SVG 是一个网页工具,打开浏览器就能用,不用装任何东西。它内置三种风格:全连接前馈网络(FCNN)、经典 LeNet 风格、AlexNet 风格。左边调参数,右边实时预览,导出 SVG。我一般用它来画前馈神经网络和全连接网络的结构示意,因为这类网络就是一层层方块的堆叠,NN-SVG 的排版算法排得比手工整齐多了。
用它的正确姿势是:先在网页上把层数、每层神经元数(或卷积层通道数)、尺寸调好,导出 SVG,再用 Illustrator 或 Inkscape 打开做二次加工——改字体、加标注、统一配色。因为网页工具的自定义能力有限,导出的图直接放论文里往往字体太大、配色太艳,必须补一遍后期。
提示:NN-SVG 导出的 SVG 是纯矢量,放大不糊,这比任何截图方案都强。但它的文字是导出的独立元素,改字体时记得全选统一替换,别只改标题。
它的短板也明显:画不了复杂的跳跃连接(比如残差网络那种跨层连线),画不了图卷积、循环神经网络的时序展开这类非直筒结构。遇到这些,得换下面的工具。
2.2 PlotNeuralNet:论文级立体结构图的性价比之选
如果你想要那种"一层层薄片斜着排开"的立体卷积神经网络结构图,PlotNeuralNet 是绕不开的。它的原理是:你用 Python 描述网络结构,它生成 LaTeX/TikZ 代码,再由 LaTeX 编译成矢量 PDF。这套流程看着绕,但换来的结果是真正的"论文级"——线宽、透视、配色全部可控,导出的 PDF 无论放多大都清晰。
安装和上手大概是这样。它依赖 Python 和 LaTeX 环境,先把仓库拉下来:
git clone https://github.com/HarisIqbal88/PlotNeuralNet cd PlotNeuralNet然后写一个描述结构的脚本,核心是往arch列表里按顺序塞层:
import sys sys.path.append('../') from pycore.tikzeng import * arch = [ to_head('..'), to_cor(), to_begin(), # 输入层 to_input('../examples/fcn8s/cats.jpg'), # 卷积层:名称、尺寸、深度、位置 to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2), # 池化层,贴在 conv1 右侧 to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"), to_Conv("conv2", 128, 64, offset="(1,0,0)", to="(pool1-east)", height=32, depth=32, width=2), to_SoftMax("soft1", 10, offset="(4,0,0)", to="(conv2-east)"), to_end() ] def main(): namefile = str(sys.argv[0]).split('.')[0] to_generate(arch, namefile + '.tex') if __name__ == '__main__': main()跑python my_arch.py生成.tex,再用pdflatex编译就得到结构图 PDF。
它最核心的价值在于位置用相对坐标描述。你看上面to="(conv1-east)"这种写法,意思是"贴到 conv1 的东侧",层与层之间的相对关系自动维护,改一层不用重新摆所有方块。这是它比手工拖拽强的地方。
坑也有两个。一是 LaTeX 环境本身劝退,Windows 上装个完整 TeX 发行版要好几个 G;二是它的默认配色偏学术蓝绿,要调成自己课题组的配色得去改样式文件,稍微花点时间。但一旦模板调好,之后画任何结构图都只是改几行参数,效率极高。
2.3 Netron:手上已经有模型文件时,别再手动画
如果你已经训练好了模型,手上有.onnx、.pt、.h5、.pb、.tflite这类模型文件,那最简单的方式是用 Netron 直接打开。它是一个模型可视化工具,装起来很简单:
pip install netron netron model.onnx它会自动把计算图渲染出来,每一层的名字、输入输出张量形状、算子类型都标得清清楚楚。我经常用它来核对模型结构——比如确认某个卷积层的通道数、kernel 大小对不对,比翻代码快得多。
但要提醒一句:Netron 是给工程师看的,不是给论文用的。它的渲染风格是调试工具风格,节点密密麻麻,直接截图放论文里非常不专业。它正确的用法是"内部核对结构",确认无误后再用 PlotNeuralNet 或 NN-SVG 画一张漂亮的示意图放进文档。这两个环节别搞混。
2.4 draw.io、PPT 与 ML Visuals:被低估的"手工派"
说到手工画图,很多人第一反应是"低端"。我不同意。draw.io(现在叫 diagrams.net)画结构框图其实非常高效,它自带对齐、吸附、连线自动绕行,画那种带跳跃连接的残差网络、带分支的多输入网络,比任何自动生成工具都灵活。而且它能导出 SVG 和 PDF,矢量无损,完全满足投稿要求。
演示文稿(PPT)派也没那么不堪——前提是你会用。Google 曾经放过一套叫 ML Visuals 的神经网络绘图素材,就是现成的演示文稿模板,里面全是画好的圆形神经元、方块层、箭头、连接线,直接复制粘贴组合就行,配色也是专业级。我用它赶过好几次汇报材料,二十分钟能出一套统一风格的图。
真正让人返工的不是工具,而是手艺问题:方块大小不一致、层间距不统一、箭头歪斜、字体混用。这些用对齐工具和网格就能解决。我自己的习惯是:手工图的实现用 draw.io,最后统一在 Inkscape 里调字体和线宽,保证和论文正文风格一致。
| 工具 | 输入方式 | 输出格式 | 立体感 | 最适合 |
|---|---|---|---|---|
| NN-SVG | 网页调参 | SVG | 无 | 前馈/全连接网络示意 |
| PlotNeuralNet | Python + LaTeX | PDF/SVG | 强 | 卷积网络论文配图 |
| Netron | 模型文件 | 屏幕预览 | 无 | 结构核对与调试 |
| draw.io | 手工拖拽 | SVG/PDF | 弱 | 复杂连接、残差网络 |
3. 训练过程与结果曲线:数据图这一类怎么选工具
结构图画完,还有一半的图是数据图。拟合曲线、损失曲线、准确率曲线、混淆矩阵,这些才是真正"跑出来"的结果。这一类工具的选择逻辑和结构图完全不同,核心看的是"数据从哪来""要不要可编辑""期刊有没有特殊要求"。
3.1 matplotlib + seaborn:绝大多数人的起点,也是终点
只要你用 Python 做实验,matplotlib 基本是默认选项。它跟训练流程无缝衔接,训练循环里存好 loss 和 acc 列表,最后几行代码就能出图。
import matplotlib.pyplot as plt epochs = range(1, len(train_loss) + 1) plt.plot(epochs, train_loss, label='train loss', linewidth=1.5) plt.plot(epochs, val_loss, label='val loss', linewidth=1.5) plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend(frameon=False) plt.grid(alpha=0.3) plt.tight_layout() plt.savefig('loss_curve.pdf') # 存矢量格式我把这段模板用了上百次。几个关键点:linewidth设成 1.5 左右,太细印出来看不见,太粗显得笨重;frameon=False去掉图例边框,期刊图讲究干净;grid(alpha=0.3)让网格线淡一点,别抢主线;最后一定存 PDF 或 SVG,别存 png 就完事。
seaborn 是 matplotlib 的上层封装,它的价值在于统计类图的默认样式更好看。画分布、箱线图、热力图(比如混淆矩阵)时,seaborn 一行代码出来的效果比手调 matplotlib 快很多。我的习惯是:折线图用 matplotlib 精细控制,统计图用 seaborn 偷懒。
提示:matplotlib 默认不支持中文字体,图里带中文会显示成方块。设置
plt.rcParams['font.sans-serif'] = ['SimHei']或换成你系统里的中文字体即可。这个坑几乎每个人都踩过一次。
3.2 MATLAB:BP神经网络拟合曲线那条老路为什么还在用
搜索热词里"bp神经网络拟合曲线"出现的频率高得离谱,一看就知道是教学和建模场景的刚需。这类需求 MATLAB 是绝对主力,原因很实在:它的神经网络工具箱把训练和绘图绑在一起了,几行代码就能出拟合曲线。
x = linspace(-1, 1, 200); y = sin(2*pi*x) + 0.1*randn(size(x)); net = feedforwardnet(10); % 单隐层,10个神经元 net.trainParam.epochs = 1000; net = train(net, x, y); y_pred = net(x); plot(x, y, 'b.', x, y_pred, 'r-', 'LineWidth', 1.2) legend('原始数据', '网络拟合')这套流程在数学建模、本科实验课、工程仿真里用得非常广,因为它把"建网络、训练、画图"三件事压缩在了十几行里。MATLAB 的绘图引擎对曲线平滑、坐标系、图例的处理也确实省心。
但做正式论文时要注意,MATLAB 默认图的字体、配色偏工程风,直接投稿不如 matplotlib 或者后期用 Origin 再加工。我的经验是:MATLAB 负责建模和快速验证,正式配图交给 Origin 或 matplotlib 重画一遍,这样风格能跟全文统一。
3.3 Origin与GraphPad Prism:期刊要矢量可编辑时的选项
不少课题组有 Origin 的授权,它就是专门做科研绘图的。优势在于所见即所得,坐标轴、误差棒、图例、多面板排版都是一拖一放,而且导出 EMF、EPS、PDF 这类矢量格式非常稳定。生物医学和材料方向用得多,因为那些领域对图的美观度要求高。
GraphPad Prism 在生命科学里更常见,统计检验、误差棒、显著性标注它做得最规范。如果你做的是需要标注显著性差异的实验,Prism 能直接生成带星号的柱状图,省掉大量手工排版。
这两个工具的共同特点是不写代码、纯图形界面、输出可编辑矢量。代价是学习成本——要花一两天熟悉图层和坐标系操作。但对于要反复出图的课题组来说,这笔投入很值,因为一套调好的模板可以批量套用。我认识的一个做材料的师兄,用 Origin 做了一套模板文件,组里所有论文的配图都基于它改,风格统一到评审都夸。
| 工具 | 门槛 | 输出可编辑 | 兼顾点 | 适合人群 |
|---|---|---|---|---|
| matplotlib/seaborn | 会 Python | 代码级可改 | 与训练流程衔接 | 算法方向 |
| MATLAB | 会基本语法 | fig 可改 | 建模绘图一体 | 教学、建模场景 |
| Origin | 图形界面 | 强 | 独立排版能力强 | 实验学科 |
| GraphPad Prism | 图形界面 | 强 | 统计标注规范 | 生命科学方向 |
4. 框架生态自带的可视化:省代码也要看场合
第三大类工具,是深度学习框架自己带或者生态里配的可视化组件。它们的优势是不用离开训练环境,缺点是用错场合反而添乱。这块我踩过不少坑,单独拎出来讲。
4.1 TensorBoard:训练曲线与计算图的一站式面板
TensorBoard 最初是 TensorFlow 的配套工具,现在 PyTorch 也能用。它把训练过程中的标量曲线、图像、直方图、计算图全部集中在一个网页面板里,训练时开着它,实时就能看到 loss 掉没掉、学习率对不对。
PyTorch 里的接入很简单:
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter('runs/exp1') for epoch in range(epochs): # ...训练代码... writer.add_scalar('loss/train', train_loss, epoch) writer.add_scalar('loss/val', val_loss, epoch) writer.add_scalar('acc/train', train_acc, epoch) writer.close()然后命令行启动:
tensorboard --logdir runs浏览器打开提示的地址就能看到面板。
我最看重的是它对比实验的能力。做消融实验时,把不同超参数的实验写到不同子目录,TensorBoard 会自动把多条曲线叠在一张图上,一眼就能看出哪个配置更好。这是手动画图很难比的优势。
但要注意,TensorBoard 的曲线是给调试看的,不能直接当论文配图。它的配色、字体、分辨率都不符合出版要求。我一般的做法是:训练阶段用 TensorBoard 盯过程,确定要放论文的那组数据后,把原始数值导出来用 matplotlib 重画。这是两件事,别合二为一。
4.2 Keras plot_model、torchviz与hiddenlayer
如果只是想快速看模型长什么样,框架生态里有几个轻量工具。
Keras/TensorFlow 的plot_model能直接把模型结构画成图:
from tensorflow.keras.utils import plot_model plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True, dpi=200)它会输出一张带张量形状的层次图,看一眼就知道每层输出维度对不对,很适合代码调试阶段的快速核对。
PyTorch 这边常用torchviz,它基于 graphviz 画计算图:
from torchviz import make_dot y = model(x) make_dot(y, params=dict(model.named_parameters())).render("net", format="png")还有hiddenlayer,能画出更紧凑的网络结构图,风格介于调试图和示意图之间。
这几个工具的前提都是装好 graphviz 并配好环境变量。这是经典坑点:pip 装了 Python 包,但系统的 graphviz 可执行程序没装或者没加到 PATH,运行时报 "dot not found"。解决办法是先装系统级的 graphviz,再装 Python 封装。Windows 用户尤其容易在这个环节卡住。
4.3 什么时候框架自带工具反而拖后腿
框架自带工具有个共同的局限:它们画的是"计算图",不是"概念图"。计算图是把每个算子都摊开,一个卷积层可能展开成一堆节点;概念图是你脑子里的抽象层次结构,一个卷积层就是一个方块。给同行看计算图可以,给评审看概念图才对。
所以我的判断标准很清楚:调试、核对、找 bug,用框架自带工具;对外发表、汇报、教学,用 NN-SVG 或 PlotNeuralNet 这类专门的绘图工具。把这两者混用,要么是调试效率低,要么是配图不专业。
还有一个隐性成本:这些工具部署在训练环境里,画图要跑一遍前向传播。如果模型很大,光是跑一次前向就要好几分钟,画个图等半天,不划算。这种情况我更愿意直接拿结构参数手工画。
5. 场景化组合与踩坑清单
工具讲完了,但真正决定出图质量的是组合方式。同一批数据,用不同组合出来的图,专业度差一个档次。下面按最常见的目标场景给出我的默认搭配,再补几个反复踩的坑。
5.1 按输出目标选组合:投稿、答辩、博客、工程交付
投稿论文:结构图用 PlotNeuralNet 出 PDF,数据图用 matplotlib 出 PDF,最后统一在 Illustrator 或 Inkscape 里调字体和线宽,全篇配色统一。这套组合最稳,因为所有元素都是矢量可编辑,改稿不慌。
答辩汇报:时间紧,别追求极致。结构图用 draw.io 或 ML Visuals 素材半小时出图,数据图用 seaborn 直接截图进演示文稿。汇报的图看的是清晰和逻辑,不是印刷级精度,效率优先。
技术博客:用 matplotlib 默认样式就够,重点是信息传达清楚,可以适当用更鲜艳的配色,因为是屏幕阅读,不需要考虑印刷。TensorBoard 的截图在这里反而是好素材,因为它有"真实训练过程"的感觉。
工程交付文档:清晰第一,美观第二。Netron 的结构截图、matplotlib 的曲线图,配上文字说明就是一份合格的文档。工程文档的读者是同事,看得懂比好看重要。
| 场景 | 结构图 | 数据图 | 关键诉求 |
|---|---|---|---|
| 论文投稿 | PlotNeuralNet | matplotlib + 后期 | 矢量、可编辑、风格统一 |
| 答辩汇报 | draw.io / ML Visuals | seaborn 截图 | 快速、清晰 |
| 技术博客 | NN-SVG | matplotlib 默认 | 信息清楚、配色活泼 |
| 工程交付 | Netron 截图 | matplotlib | 准确、易懂 |
5.2 几个反反复复踩的坑
第一个坑是分辨率。网页截图和演示文稿截图默认只有 72 到 96 dpi,印出来糊得没法看。凡是最终要进论文的图,一律走矢量格式或者导出 300 dpi 以上位图。我现在养成习惯,任何工具的导出设置里先把 dpi 调到 300,或者直接选 PDF/SVG。
第二个坑是字体不统一。同一篇论文里,结构图用了一种字体,曲线图用了另一种,正文又是第三种,拼在一起非常违和。解决办法是画完所有图后,用 Inkscape 批量把文字图层改成统一字体。这活儿看着琐碎,但评审的观感确实差很多。
第三个坑是graphviz 环境没配好。前面提过,plot_model、torchviz都依赖系统级的 graphviz,光 pip 装包不够。正确顺序是先装系统可执行程序,确认命令行里dot -V能输出版本号,再装 Python 包。这个顺序错了,报错信息还特别不友好。
第四个坑是拿训练时的实时曲线直接截图。TensorBoard 上的曲线是调试用的,它的坐标轴范围、图例位置都不适合出版。正确做法是把原始数值导出重画,别偷这个懒。
第五个坑是用 AI 滤镜类工具画结构图。经常有人搞混,拿图像生成工具去"画一个神经网络结构",结果出来的都是抽象艺术画。记住:结构图要用专门的示意图工具,图像生成类是另一个需求。
我个人的固定流程是这样的:训练阶段用 TensorBoard 盯曲线,确定好数据后导出数值用 matplotlib 重画成 PDF;结构图用 PlotNeuralNet 出稿,需要快速汇报时用 draw.io 救急;所有图最后过一遍 Inkscape 统一字体和线宽。这套流程跑下来,一套论文配图两三个小时能搞定,比当年用演示文稿硬拼快太多了。工具本身没有绝对的好坏,关键是把需求拆对、把输出格式选对,剩下的就是熟练度问题。真要给一句经验之谈,那就是:调试用工程师的工具,发表用设计师的思路,这两条线别混。