Dynamic Routing Between Capsules
Qingyi Si(佀庆一)
CapsNet VS. CNN
CapsNet:
a) Conv 1:常规卷积层提取局部特征
b) PrimaryCaps:由卷积过程构成的
capsule版卷积层,计算上等效与常规
卷积层,深层意义上不等,每个
capsule内部的8个feature构成了一个
由意义的整体
c) DigitCaps:全连接层
CNN:
重复卷积、pooling过程,最后
一个或多个fully connect层
one/
capsule_net
__call__():来选择构建哪种layer(CONV,FC)
routing():从上层的capsule的输出得到下层capsule的输入,
并且不断更新胶囊之间的权重系数C_ij, 这里不必根据loss来更新
squash():构造了一个针对向量的非线性激活函数
two/
CAPSULE_LAYER
Build_arch():构造整个模型的各个层
一/CAPSULE_NET
CapsNet: 两个卷积层(Conv 1, PrimaryCaps),一个全连接层(DigitCaps)
而在全连接层(及第二层到第三层之间)用了routing函数
第一层是一个普通的卷积层,由256个9x9的卷积核,得到了
20x20x256的三维矩阵(步幅为1:28-9+1=20)。
没有padding
第二层是primary capsules
• 调用了CapsLayer()函数,但是没用里面的routing函数(False),而是调
用了普通的conv2d()函数,文件CapLayer.py中的__call__()函数完成
选择调用哪个函数来创建layer
具体如何调用和构建layer后面再解释~
第二层primaryCapsule
9x9
2x2
32
kernel size
conv stride
#Channels
Input size
20x20x256
non-linearity fun
Squashing fun(Eq. 1)
可将PrimaryCaps layer视为 8个并行常规卷积层的叠堆,
并且激活函数用了前面的squash,但是没用routing
从图中可以看出PrimaryCaps层的张量维度为6x6x8x32
(从上一层卷积得到6x6的方形矩阵,卷积核为9x9,步幅为2,故(20-9+1)/2=6)
,32是32个9x9的卷积核在步幅为2的情况下做的卷积,即应得到的张量维度为6x6x32,
而图上还有一个维度(vector的长度)为8.这个8是8个并行常规卷积层的堆叠而成。
routing