原文:Dynamic Routing Between Capsules--2017
代码:
https://github.com/naturomics/CapsNet-Tensorflow
https://github.com/adambielski/CapsNet-pytorch
pytorch配套代码讲解:Capsule Net 代码阅读笔记
计算机图形学做的是渲染,而计算视觉做的就是渲染的逆过程。渲染是将三维的图像投影到二维,在数学上意味着给原图乘以一个固定的矩阵。而计算机视觉做的,则是Inverse Graphics(逆渲染),也就是从二维的图像推测出本身的三维结构。
在计算机视觉中卷积神经网络取得了很大的成功,也很受欢迎。但是,它也不是适合所有的任务,他在架构上有一些缺陷。
CNNs提取图像中的特征并通过特征学习识别物体。网络底层学习一般性特征,比如轮廓,随着层数的加深,提取的特征更加复杂,比如像眼睛、鼻子或者整张脸。然后,网络用它学习到的所有特征作出最后的预测。这里存在一个缺陷,在CNN中没有可用的空间信息,而用于连接的池化层,效率实际上也非常低。
在池化过程中,很多重要的信息都损失了,因为只有最活跃的神经元会被选择传递到下一层,而这也是层之间有价值的空间信息丢失的原因。
卷积神经网络的问题是其神经员之间都是平等的,没有内部的组织结构,这导致无法保证在不同位置,不同角度下对同一个物品做出相同的识别,也无法提取不同卷积核得出的子结构之间的相互关系。CNN中采用的分块和共享权重,其目标都是希望能够使神经网络学到的特征提取之术能够在图形出现微小变化时能够应对,而不是针对图形的变化,对应神经网络进行相应的改变。
当前卷积神经网络的限制与不足:
①CNN通过池化操作能够获得invariance,有助于分析,但是同时一些局部信息也会丢失。如果数据发生旋转、倾斜,其效果会很差
②CNN很难解释部分与整体之间的位置关系。
当前针对问题1现有两种方法解决方案,一是数据增强,通过对训练样本进行旋转、位移生成新的训练集;二是使用更多的参数去建模,也就是构建一个更深层的网络。但是这些方法局限性也很大,缺少局部的等变特性(equivariance),所以其泛化能力很弱。
为了解决这个问题,Hinton提出使用一个叫做“动态路由(也称routing-by-agreement)”的过程。这意味着,较为底层的特征(手、眼睛、嘴巴等)将只被传送到与之匹配的高层。如果,底层特征包含的是类似于眼睛或者嘴巴的特征,它将传递到“面部”的高层,如果底层特征包含的是类似手指、手掌等特征,它将传递到“手”的高层。

胶囊网络的输入输出都是向量,由两部分组成,浅层胶囊输出的向量输入到深层胶囊中,最后的输出一个向量 v。 代表某个种类的pattern(图形、样式)是否存在,
包含很多细节(方向)决定 pattern 的特征。
胶囊的内部结构

和
是上一层胶囊输出的activity vector,通过
和
(通过训练得到的权重,
就相当于一种变换)的仿射变换得到
和
,即
,
最终通过一个squashing function
得到输出的activity vector。
如何得到c

传统神经网络 VS 胶囊网络

胶囊网络架构

1、Conv Layer——提取用于后续胶囊分析的特征。论文中包含大小为9*9*1的256个卷积核。
2、PrimaryCaps——这是下级胶囊层,包含32个不同的胶囊,每个胶囊将第8个9*9*256的卷积核用于之前卷积层的输出,并输出4D向量。
3、DigitCaps——上级胶囊层,使用动态路由的主要胶囊层,该层输出16D向量,包含重建对象所需要的实例化参数。

网络的输出层和神经网络一样输出10个(手写体数字集)vector(神经网络输出 scale),而且还有1个额外的神经网络用于重建图像。
手写体数字集实验结果

而且 CapsNet比传统卷积更具有鲁棒性,具有一定的可解释性。

参考链接:
如何看待Hinton的论文《Dynamic Routing Between Capsules》? - 云梦居客的回答 - 知乎
胶囊网络(Capsule)碎碎念 - 努力搬砖的小李的文章 - 知乎
胶囊网络结构Capsule初探 - 许铁-巡洋舰科技的文章 - 知乎
Capsule Network胶囊网络 - 一颗柠檬味的橙子的文章 - 知乎
如何理解和使用胶囊网络
CapsNet ——胶囊网络原理
李宏毅讲解胶囊网络
部分图片来源
网友评论