神经网络可视化
神经网络架构和参数的可视化。
新闻
- (2023.11.23) 硕士论文已发表 [链接] [pdf]
- (2023.10.13) 新增 Docker 支持(参见 DOCKER.md 和 Docker 镜像(参见 这里)
- (2023.10.11) 修复了演示和评估脚本的错误,并添加了更多示例网络
- (2022.12.30) 新增 VR 支持(参见 VR_TOOL.md
论文
这个项目是为我的硕士论文而做的。论文的总体描述如下:
摘要
人工神经网络是人工智能领域的一个热门研究方向。大型模型日益增长的规模和复杂性带来了一些问题。神经网络内部工作机制的不透明性使得为不同任务选择高效的架构变得困难。解决这些问题具有挑战性,而缺乏对神经网络的深入表示使得这种状况更加根深蒂固。鉴于这些困难,本文引入了一种新颖的三维可视化技术。通过利用神经网络优化领域的成熟方法来估计已训练神经网络的属性。使用批量归一化进行微调和特征提取,以估计神经网络不同部分的重要性。将重要性值与边缘捆绑、光线追踪、3D 替代物和特殊透明度技术等各种方法相结合,得到表示神经网络的三维模型。论文展示了提取的重要性估计的有效性,并探讨了所开发可视化技术的潜力。
全文
引用
如果您在研究中使用了我的工作,请使用以下 BibTeX 条目进行引用:
@mastersthesis{Rogawski2023,
author = {Julian Rogawski},
title = {Visualization of Neural Networks},
type = {masterthesis},
pages = {ii, 48},
school = {Universit{\"a}t Koblenz, Universit{\"a}tsbibliothek},
year = {2023},
}
使用方法
- 根据这里描述的参数准备
configs/processing.json
。 - 创建神经网络模型并进行处理。在
examples/process_mnist_model.py
中给出了一个使用 MNIST 数据的示例过程。 - 启动可视化工具
start_tool.py
,通过"加载已处理网络"选择神经网络以渲染其表示。- 使用"加载已处理网络"可以选择并加载已处理的模型,包括已捆绑的边和节点。
- 使用"加载网络"可以选择并加载未处理的网络及其重要性值,边和节点未捆绑。
或者
- 运行
start_tool.py --demo
下载一些已处理模型的数据和重要性数据,加载并渲染其中一个。- 使用"加载已处理网络"可以选择不同的已处理网络并进行可视化。
- 使用"加载网络"可以选择不同的未处理网络,仅包含重要性值,没有节点和边的捆绑。
examples
目录中有多个脚本,可以用于创建和处理神经网络。例如,examples/evaluation_plots.py
可用于重新创建我论文中的评估数据和图表。
示例模型重要性
可以在这里下载已处理的模型。
渲染工具
可视化工具 start_tool.py
可用于渲染和/或处理神经网络。除了现有的网络,你还可以生成并处理各种规模的随机网络。对于神经网络,与最常见的可视化方法相比,该可视化方法可以根据训练后的参数提供更有结构的神经网络视图。
VR
更多信息请参见 VR_TOOL.md。
Docker
更多信息请参见 DOCKER.md。
示例
上图展示的三个神经网络具有相同的架构,但参数训练方式不同。左侧的网络完全未训练,随机分配了值。该模型的节点和边缘从中心扩散得更远。中间的网络使用一些基本的学习率设置进行训练,准确率超过90%。右侧的网络以相同的方式训练,但额外使用了 *L1* 正则化,准确率相似,是最窄的模型。**边缘越靠近,表示神经网络这些部分的泛化能力越强**。控制
按键 | 描述 |
---|---|
H | 切换旋转 |
K | 截图 |
0-9 | 切换相机位置 |
图形用户界面
着色器设置、统计信息以及神经网络处理的一般设置可以通过图形用户界面控制。
着色器参数
渲染神经网络的着色器中使用的参数可以通过 configs/rendering.json
或在图形用户界面中更改。可视化效果可能会有很大差异,不同的结果可以在这里查看。
名称 | 推荐值 | 范围 | 描述 |
---|---|---|---|
大小 | 0.02 | 0 - 1.0 | 基本对象的大小 |
基础不透明度 | 0.0 | 0.0 - 1.0 | 对象的基础不透明度 |
重要性不透明度 | 1.1 | 0.0 - 2.0 | 重要性值影响不透明度的比率 |
深度不透明度 | 0.5 | 0.0 - 1.0 | 到相机距离影响不透明度的比率 |
深度指数 | 0.25 | 0.0 - 10.0 | 对象不同点的密度影响不透明度的比率 |
重要性阈值 | 0.1 | 0.0 - 1.0 | 根据重要性值决定是否渲染对象的阈值 |
处理
上面的流程图解释了通过我的代码进行神经网络打包的过程。 这张图展示了处理流程中的不同阶段。参数
处理过程可以通过以下参数进行调整。默认值通常来源于与边缘打包方法相关的实证测试值。某些参数对处理时间有很大影响。
名称 | 推荐值 | 范围 | 描述 | 性能影响 |
---|---|---|---|---|
edge_bandwidth_reduction | 0.9 | 0 - 1.0 | 每次迭代时边缘样本的平移范围减少量 | 高 |
node_bandwidth_reduction | 0.95 | 0 - 1.0 | 每次迭代时节点的平移范围减少量 | 低 |
edge_importance_type | 0 | {0,1,2,3} | 边缘重要性的计算类型 | 低 |
layer_distance | 0.5 | 0.0 - 1.0 | 每个神经网络层的节点之间的距离 | 中 |
layer_width | 1.0 | 0.0 - 1.0 | 节点所在的每层切片的宽度 | 中 |
prune_percentage | 0.0 | 0.0 - 1.0 | 应忽略的边缘百分比,按重要性值排序,值越低意味着处理时间越长 | 高 |
sampling_rate | 15.0 | 5.0 - 20.0 | 定义每单位距离创建的样本数量,采样率越高意味着细节越多 | 非常高 |
smoothing | true | {true, false} | 是否在每次迭代之间应用边缘平滑?没有平滑可能会导致断裂 | 高 |
smoothing_iterations | 8 | 0 - 16 | 每次平移迭代之间的平滑迭代次数 | 高 |
要更改处理参数,请修改以下文件中的值: configs/processing.json
{
"edge_bandwidth_reduction": 0.9,
"edge_importance_type": 0,
"layer_distance": 0.5,
"layer_width": 1.0,
"node_bandwidth_reduction": 0.95,
"prune_percentage": 0.0,
"sampling_rate": 15.0,
"smoothing": true,
"smoothing_iterations": 8
}
重要性
每个分类由一种颜色表示。节点和边缘的颜色根据它们在网络中对正确预测相关类别的重要性而定。通过按计算出的重要性顺序修剪模型参数来验证重要性的有效性。
整体重要性修剪 | 类别重要性修剪 |
---|---|
左图显示,修剪不重要的参数对模型的预测准确性的影响不如重要参数那么大。
同样,基于特定类别的重要性进行修剪也显示,右图中特定类别的准确性得到了保留。关注类别的准确性始终高于整体准确性。
使用的系统
- Windows 10
- NVIDIA GeForce RTX 3080
- AMD Ryzen 7 3700X
注意事项
- 处理时间 - 处理一个完全连接的神经网络,每层节点数为:784、81、49、10,需要3-4分钟。因此,一次性计算不是实时的。
- Python版本 - 在3.9版本上测试(3.7和3.8版本在旧的Python依赖项上测试过)
- 依赖项 - 查看
requirements.txt