views, comments.

【深度学习】原来早就有人将CNN可视化了

Omnivore

Read on Omnivore

Read Original

date_saved: 2024-03-25 12:53:03

date_published: 2024-02-20 14:57:00


Full Content:

人工智能大讲堂 人工智能大讲堂 2024-02-21 03:57 辽宁

做计算机视觉,怎么能离开CNN?

这个模拟生物视觉系统的东西,包括了卷积、池化、Softmax……等一系列操作。

可是,卷积、池化、Softmax……究竟长啥样,是怎样相互连接在一起的?

仅凭代码凭空想象,多少让人有点头皮微凉。于是,有人干脆用Unity给它完整3D可视化了出来。

视频: https://vimeo.com/stefsietz 源代码: ==http====s:====//github.====com====/stefsietz/====nn====-visualizer== 项目主页: ==http:====//====visuality.at====/vis2/==

图片

很多模型可视化工具,大多只是一个原型,你没办法导入其它模型。

这个不仅支持导入训练好的模型,还能把训练过程也看得明明白白。

比如随着epoch(迭代次数)的变化,训练过程中各层出现的实时变化。

图片

图片

为了能更清楚地展示网络细节,用户还可以在其中自由地折叠、扩展每个层。

比如将特征图在线性布局和网格布局之间转换。

图片

折叠卷积层的特征图输出。

图片

对全连接层进行边绑定(edge bunding)等等。

图片

这样的可视化图像,可以通过加载TensorFlow的检查点来构建。但需要通过Github源码仓库中的转换工具将TensorFlow的检查点转换成可执行程序支持的json文件。

图片

也可以在Unity编辑器中设计。

图片

该项目的作者Stefan Sietzen,是一位来自维也纳的3D特效师。

图片

据他介绍,之所以创建这样一个CNN可视化工具,是因为他自己初学神经网络时,经常觉得很难理解卷积层之间是如何相互连接,又如何与不同类型的层连接的。

而该工具的主要功能包括,卷积、最大池化和完全连接层的可视化表示,以及各种能实现更清晰可视化的简化机制等等。

总而言之,就是想让初学者通过最直观的方式,来get到CNN的重点。

如何用Unity搞出一个3D网络

在正式上手Unity前,作者先在Houdini软件中,搭建了一个可视化的3D网络原型。

图片

也就是说,先给Unity版3D网络提供一个搭建思路,提前准备好实现展示卷积计算的方法、特征图的形状、边绑定的效果等问题。

它的节点编辑器长这样:

图片

然后,就可以在Unity上搭建3D神经网络了。

首先,需要预设好神经网络的“形状”。

由于之前并没有用过Unity,作者先学习了着色器和过程式几何相关的知识。

这里面,作者发现了一些局限性,他采用的是Unity为着色器开发的语言Shaderlab,这个语言无法使用着色变化,只有对语义进行预定义的变量,才能让它在顶点、几何和像素着色器之间传递。

而且,它无法任意分配顶点属性,只有位置、颜色、UV等预定义属性。(可能这也是3D网络无法实时改变颜色的原因之一)

图片

在研究了一些实例化(instancing)相关的概念后,作者计划采用几何着色器的方法生成神经网络的连线。其中起点和终点被传递到顶点着色器,并直接转发到几何着色器。

这些线,最多可以由120个顶点组成,因为Unity允许的几何着色器能创建的变量的标量浮点数为1024。

设计后的网络形状,大致长这样:

图片

然后,就是从模型的TensorFlow代码中,生成对应的3D神经网络图像。

其中,Tensorflow-native.ckpt格式的文件,需要存储重构模型图所需的数据、二进制的权重读取和激活值,以及特定层的名字。

以Cifar10-greyscale数据集为例,需要编写一个检查点(checkpoint)文件,以及设置随即初始化的权重。

图片

在那之后,需要加载这些检查点文件、启动TensorFlow会话,输入训练示例,以便查询每一层的激活函数。

然后编写一个json文件,存储每一层的形状、名称、权重和激活函数,便于读取。然后使用权重值,将颜色数据分配给各层的Unity Mesh。

图片

最终搞出来的效果,还是不错的:

图片

参考:

[1]https://www.cg.tuwien.ac.at/courses/Visualisierung2/HallOfFame/2018/OtherTopic02/html/detail.html

[2]http://visuality.at/vis2/

![](https://proxy-prod.omnivore-image-cache.app/0x0,sztHen2zKglbooc8jnRanh8F2QK9kejIH_eS7fuz0zAU/data:image/svg+xml,%3Csvg xmlns=“http://www.w3.org/2000/svg\” width=“24” height=“24” viewBox=“0 0 24 24” fill=“none”%3E%0A%3Cpath d=“M12.8974 15.5585L14.9719 13.484L16.2447 14.7568L12.3519 18.6497C12.1566 18.8449 11.84 18.8449 11.6448 18.6497L7.75195 14.7568L9.02475 13.484L11.0974 15.5567L11.1 4.99976L12.9 5.0002L12.8974 15.5585Z” fill=“black” opacity=“0.3”/%3E%0A%3C/svg%3E) 继续滑动看下一个


Highlights

https://github.com/stefsietz/nn\-visualizer ⤴️

http://visuality.at/vis2/ ⤴️