Intro
由于涉及比较多的公式,而github不支持MathJax或者LaTeX,所以如果想获得更好的阅读体验请安装chrome插件GitHub with MathJax,或者有更好的方法恳请告知。
本文记录了阅读论文《Dynamic Routing Between Capsules》以及naturomics的代码的理解与收获,若有错误欢迎指出(wjy.f@qq.com),转载请注明出处。
若想通过视频快速了解,可以看看下面两个链接,讲得比较生动易理解(不过还是推荐读论文):
Main
CapsNet
结构概述
论文仅仅是提出了一个可行的方案,目的是为了证明Capsule
这个思想的可行性,目前还较为粗略,有很多改进空间。论文有两个比较突出的创新点:
- 采用 routing-by-agreement mechainsm 决定两层capsule之间的连接以及参数 cij c i j 的更新方式
- 用向量输出替代标量输出
下图是论文中所采用的神经网络结构:
看完这幅图应该大概能理解CapsNet的结构。它先是对图像用了两次卷积得到PrimaryCaps,然后用Routing-By-Agreement Mechanism得到DigitCaps。最后,求DigitCaps中的10个向量的长度,比如说最长的是第4个向量,那么就意味着CapsNet识别出当前输入的图片是数字4。
看到这里,何为Capsule
?在PrimaryCaps中,它指的是长度为8的向量,共6*6*32个。而在DigitCaps中,它指的是16维的向量,共10个。所以Capsule其实对应着传统神经网络的scalar,只是一个scalar能够表征的信息太少了,所以将其扩展为向量,这样它就能够表示更多的信息。有人说,之所以提出这种想法是因为Hinton观察到人的大脑不是像神经网络一样严格分层,而是一簇簇神经元作为一个整体的。
CapsNet的结构是Image(input)->Conv1->PrimaryCaps->DigitCaps(output)->Reconstruction,下文也会按照这个顺序来讲解
在下文中,若 i 指 layerl l a y e r l 的某一个capsule ,那么 j 就是指 layerl+1 l a y e r l + 1 的某一个capsule。
image to ReLU Conv1 to PrimaryCaps
论文使用的是MNIST手写识别数据集,每张图片的大小都是28*28。
流程:
image(28 * 28)
images → →
Conv(num_outputs=256, kernel_size=9, stride=1, padding='VALID') + ReLU
→ → Conv1(256 * 20 * 20)Conv1 → →
Conv(num_outputs=256, kernel_size=9, stride=2, padding="VALID") + ReLU
→ → PrimaryCaps(256 * 6 * 6)
这里可能会有人奇怪,这里不过是用了256个filter产生256个feature map,图片为什么会画成(32 * 8 * 6 * 6)的形式,这是因为后面的路由算法是将一个长度为8的向量当做一个整体来计算的。
PrimaryCaps to DigitCaps & Dynamic Routing
- 下面讲解从PrimaryCaps → → DigitCaps的计算过程,其中主要应用了Routing-By-Agreement Mechanism
一张图表示他们之间的关系:
注意,图片中仅展示了一个 vj,j∈(1,10) v j , j ∈ ( 1 , 10 ) 的求解过程,其他 vj v j 同理可得。
公式
- ui(i∈[6∗6∗32]) u i ( i ∈ [ 6 ∗ 6 ∗ 32 ] ) : 表示PrimaryCaps的某个8D的Capsule
- û j|i u ^ j | i : 论文中称之为低一层的capsules的“prediction vectors”