一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

这是「进击的Coder」的第 355 篇技术分享
作者:萧箫 鱼羊
来源:量子位(QbitAI)

阅读本文大概需要 7 分钟。



做计算机视觉,离不开 CNN。
可是,卷积、池化、Softmax……究竟长啥样,是怎样相互连接在一起的?
对着代码凭空想象,多少让人有点头皮微凉。于是,有人干脆用 Unity 给它完整 3D 可视化了出来。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
还不光是有个架子,训练过程也都呈现得明明白白。
比如随着 epoch(迭代次数)的变化,训练过程中各层出现的实时变化。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
为了能更清楚地展示网络细节,用户还可以在其中自由地折叠、扩展每个层。
比如将特征图在线性布局和网格布局之间转换。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
折叠卷积层的特征图输出。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
对全连接层进行边绑定(edge bunding)等等。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
这样的可视化图像,可以通过加载 TensorFlow 的检查点来构建。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
也可以在 Unity 编辑器中设计。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
是不是有点鹅妹子嘤那感觉了?
最近,这个项目又在社交媒体上火了起来。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
网友们纷纷表示:
“要是能在训练的时候看到这个过程,再长时间我也能忍啊。”
“求开源。”
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
该项目的作者,是一位来自维也纳的 3D 特效师。
据他介绍,之所以创建这样一个 CNN 可视化工具,是因为他自己初学神经网络时,经常觉得很难理解卷积层之间是如何相互连接,又如何与不同类型的层连接的。
而该工具的主要功能包括,卷积、最大池化和完全连接层的可视化表示,以及各种能实现更清晰可视化的简化机制等等。
总而言之,就是想让初学者通过最直观的方式,来 get 到 CNN 的重点。

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

在正式上手 Unity 前,作者先在 Houdini 软件中,搭建了一个可视化的 3D 网络原型。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
也就是说,先给 Unity 版 3D 网络提供一个搭建思路,提前准备好实现展示卷积计算的方法、特征图的形状、边绑定的效果等问题。
它的节点编辑器长这样:
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
然后,就可以在 Unity 上搭建 3D 神经网络了。
首先,需要预设好神经网络的 “形状”。
由于之前并没有用过 Unity,作者先学习了着色器和过程式几何相关的知识。
这里面,作者发现了一些局限性,他采用的是 Unity 为着色器开发的语言 Shaderlab,这个语言无法使用着色变化,只有对语义进行预定义的变量,才能让它在顶点、几何和像素着色器之间传递。
而且,它无法任意分配顶点属性,只有位置、颜色、UV等预定义属性。(可能这也是 3D 网络无法实时改变颜色的原因之一)
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
在研究了一些实例化(instancing)相关的概念后,作者计划采用几何着色器的方法生成神经网络的连线。其中起点和终点被传递到顶点着色器,并直接转发到几何着色器。
这些线,最多可以由 120 个顶点组成,因为 Unity 允许的几何着色器能创建的变量的标量浮点数为 1024。
设计后的网络形状,大致长这样:
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
然后,就是从模型的 TensorFlow 代码中,生成对应的 3D 神经网络图像。
其中,Tensorflow-native.ckpt 格式的文件,需要存储重构模型图所需的数据、二进制的权重读取和激活值,以及特定层的名字。
以 Cifar10-greyscale 数据集为例,需要编写一个检查点(checkpoint)文件,以及设置随即初始化的权重。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
在那之后,需要加载这些检查点文件、启动 TensorFlow 会话,输入训练示例,以便查询每一层的激活函数。
然后编写一个 json 文件,存储每一层的形状、名称、权重和激活函数,便于读取。然后使用权重值,将颜色数据分配给各层的 Unity Mesh。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
最终搞出来的效果,还是不错的:
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
作者还录了个开发视频,在文末可以找到地址。

相关研究还不少

事实上,此前已经有不少学者,进行过神经网络可视化的研究。
例如,去年 5 月,一位中国博士就可视化了卷积神经网络,将每一层的变化都展示得非常清楚,只需要点击对应的神经元,就能看见它的“操作”。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
这是用 TensorFlow.js 加载的一个 10 层预训练模型,相当于在浏览器上就能跑 CNN 模型,也可以实时交互,显示神经元的变化。
不过,这还是个 2D 的项目。
目前,也已经有人像上面那个神经网络模型一样,做出了 3D 的可视化神经网络:
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
这个项目,同样用到了边绑定、光线追踪等技术,与特征提取、微调和归一化相结合,将神经网络可视化。
这项项目希望能借由这些技术,来估计神经网络中不同部分的重要性。
为此,作者将神经网络的每一部分都用不同的颜色来表示,根据节点和节点在网络中的重要性,来预测它们之间的关联性。
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
大致的处理过程是这样的:
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
如果对于这类 3D 神经网络可视化感兴趣,可以在文末找到对应的开源项目地址。

作者介绍

一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

Stefan Sietzen,现居维也纳,此前曾是个 3D 视觉方向的自由职业者。

目前,他在维也纳工业大学读硕,对视觉计算(visual computing)非常感兴趣,这个 3D 神经网络,就是他在硕士期间做的项目之一。

开发过程:
https://vimeo.com/stefsietz

已开源的3D神经网络项目:
https://github.com/julrog/nn_vis

参考链接:
https://www.reddit.com/r/MachineLearning/comments/leq2kf/d_convolution_neural_network_visualization_made/
https://mp.weixin.qq.com/s/tmx59J75wuRii4RuOT8TTg
https://vimeo.com/stefsietz
http://portfolio.stefansietzen.at/
http://visuality.at/vis2/detail.html

一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

End

「进击的Coder」专属学习群已正式成立,搜索「CQCcqc4」添加崔庆才的个人微信或者扫描下方二维码拉您入群交流学习。


一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

看完记得关注@进击的Coder
及时收看更多好文
↓↓↓

一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...


点个在看你最好看

原文始发于微信公众号(进击的Coder):一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
一位外国小哥把整个 CNN 都给可视化了,卷积、池化清清楚楚!网友:美得不真实...
这是「进击的Coder」的第 355 篇技术分享 作者:萧箫 鱼羊 来源:量子位(QbitAI) “ 阅读本文大概需要 7 分钟。 ” 做计算机视觉,离不开 CN……
<<上一篇
下一篇>>