天天看点

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

作者:生信宝典

最近,有个项目在社交媒体上火起来了,项目作者是来自维也纳的3D特效师。

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

创建这样一个CNN可视化工具,是它在硕士论文完成,因为当初学的就是神经网络,学的过程中很难明白卷积层之间是如何相互连接,又如何与不同类型的层连接的。

所以创建这个项目,主要能让此工具的主要功能包括,卷积、最大池化和完全连接层的可视化表示,还有各种能实现更清晰可视化的简化机制等等。

发布这个自己学习成功成果,就是想让初学者通过最直观的方式,来get到CNN的重点,也让人更多深刻的了解明白!

怎么用Unity搞出一个3D网络

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

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

提前,预设好神经网络的“形状”,由于之前并没有用过Unity,作者先学习了着色器和过程式几何相关的知识。

这里面,作者发现了一些局限性,他采用的是Unity为着色器开发的语言Shaderlab。

这个语言无法使用着色变化,只有对语义进行预定义的变量,才能让它在顶点、几何和像素着色器之间传递。

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

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

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

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

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

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

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

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

随后编写一个json文件,存储每一层的形状、名称、权重和激活函数,便于读取。

最终展示的效果,看起来是让人容易读懂!

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

这个项目可不止这国外的小哥想到演示,就在去年时候,一位中国博士就可视化了卷积神经网络,也是每一层的变化都展示得非常清楚,如下图显示那样!

外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!

而且在GitHub上星标的5千2星星,热度还行,这个项目,同样用到了边绑定、光线追踪等技术,与特征提取、微调和归一化相结合,将神经网络可视化。

这项项目希望能借由这些技术,来估计神经网络中不同部分的重要性。

如果你对这类3D神经网络可视化感兴趣,可以去小编给的GitHub上项目了解相关详情哦!

开发过程:

https://vimeo.com/stefsietz

已开源的3D神经网络项目:

https://github.com/julrog/nn_vis

中国版的神经网络项目

https://github.com/poloclub/cnn-explainer

参考链接:

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