3D图解神经网络

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

源 |量子位

做计算机视觉,离不开CNN。

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

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

0af5b74366e026ecaf9a7538c6ea26ce.gif

还不光是有个架子,训练过程也都呈现得明明白白。

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

73a829e9e2d2e6f6643b4cadfe51f83b.gif 53ca107b1698368c576671de4fc3e970.gif

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

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

29e0d8d8c7ed1358a2ad95a6777910fc.gif

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

525d2e665f9561464f32496cf2969dbf.gif

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

515b00b8a21cd3e1d51dd1edb0870957.gif

这样的可视化图像,可以通过加载TensorFlow的检查点来构建。

c677314bce3b55bfa2ff6ee1da015c9f.png

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

82ce1e1804521754189c507ae7a03eb7.png

是不是有点鹅妹子嘤那感觉了?

最近,这个项目又在社交媒体上火了起来。

ace1a9d46d4eb0a3fc01909b35a21862.png

网友们纷纷表示:

“要是能在训练的时候看到这个过程,再长时间我也能忍啊。”

“求开源。”

01da9d84cf7ca317ab4d25edda1a8dfd.png

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

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

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

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

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

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

5aeb1999f382debe4366b778542b26ca.png

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

它的节点编辑器长这样:

ebb72ca9c0a07782dd355e60b20d9fe3.png

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

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

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

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

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

d9cea7cf17bcbaa1101b3b3677411b18.png

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

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

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

f465a348d23fa0018b508c5a57164243.png

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

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

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

ac7108ab95850450a555c2af5f43d22c.png

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

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

680e92d9f44ecc93a7c0e4ad4bd86bc3.png

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

d55a3cc57bf5f76d27c863f2ea8a2040.gif

作者还录了个开发视频,在文末可以找到地址。

相关研究还不少

事实上,此前已经有不少学者,进行过神经网络可视化的研究。

例如,去年5月,一位中国博士就可视化了卷积神经网络,将每一层的变化都展示得非常清楚,只需要点击对应的神经元,就能看见它的“操作”。

611d8ab27dc064148b292c41b9ef1265.gif

这是用TensorFlow.js加载的一个10层预训练模型,相当于在浏览器上就能跑CNN模型,也可以实时交互,显示神经元的变化。

不过,这还是个2D的项目。

目前,也已经有人像上面那个神经网络模型一样,做出了3D的可视化神经网络:

4941ea57283cd5facf2aa99177b2d28a.gif

这个项目,同样用到了边绑定、光线追踪等技术,与特征提取、微调和归一化相结合,将神经网络可视化。

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

为此,作者将神经网络的每一部分都用不同的颜色来表示,根据节点和节点在网络中的重要性,来预测它们之间的关联性。

d52ce92c1de238ae163dd093e545a772.png

大致的处理过程是这样的:

aa5c6d9275ddc81e3fa8038c2957ca3e.png

如果对于这类3D神经网络可视化感兴趣,可以在文末找到对应的开源项目地址。

作者介绍

5a30f7da5ee29fcd7a5a01540ffec807.png

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

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

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

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

 
 

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

 
 

1105374f5398ae57d55f8b6eca1e9d53.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环神经网络(Recurrent Neural Network,RNN)是一种具有循环连接的神经网络结构,主要用于处理序列数据。相比于传统的前馈神经网络,RNN能够在处理序列数据时保留过去的信息,并将其传递给下一个时间步骤。 下面是一个简化的RNN图解: ``` x[t] h[t-1] h[t] y[t] │ │ │ │ └──────►┌───┴────┐ │ │ │ RNN │ │ │ └─────────┘ │ │ └──►┌─────┐◄─┘ │ act │ └─────┘ ``` 在这个图中,输入是当前时间步骤(t时刻)的输入x[t]和上一个时间步骤(t-1时刻)的隐藏状态h[t-1]。隐藏状态h[t-1]存储了RNN之前的信息,通过循环连接传递给当前时间步骤的隐藏状态h[t]。h[t]不仅可以传递给下一个时间步骤,也可以作为输出y[t]的一部分。 在RNN中,每个时间步骤都有一个相同的权重参数集合。这意味着RNN在处理不同时间步骤的输入时使用相同的参数。这种共享参数的方式使得RNN能够处理任意长度的序列数据。 RNN可以使用不同的激活函数来控制信息的流动和处理方式。常用的激活函数包括tanh、ReLU等。 RNN的循环连接使得它可以处理时序信息,例如自然语言处理、语音识别、时间序列预测等任务。然而,传统的RNN也存在梯度消失和梯度爆炸的问题,导致长期记忆和长期依赖任务的困难。 相关问题: 1. RNN的梯度消失和梯度爆炸问题是如何产生的? 2. 除了RNN,还有哪些用于处理序列数据的神经网络结构? 3. RNN的隐藏状态有什么作用?它如何影响信息传递和处理过程? 4. 在实际应用中,如何选择合适的激活函数来构建RNN? 5. RNN是否适合处理长序列数据?如何改进RNN来解决长期记忆和长期依赖问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值