最近学习Hinton大神提出的CapsNet,此篇文章主要介绍capsnet的第一个版本,主要针对cnn的一些问题,核心是提出了动态路由的观点。论文《Dynamic Routing Between Capsules》
网络结构如下图所示
主要分为:输入层、卷积层、主胶囊层、数字胶囊层
动态路由部分介绍:

class CapsuleNet(nn.Module):def __init__(self,input_size,classes,routings):super(CapsuleNet,self).__init__()self.input_size=input_sizeself.classes=classesself.routings=routingsself.conv1=nn.Conv2d(input_size[0],256,kernel_size=9,stride=1,padding=0)self.primarycaps=PrimaryCapsule(256,256,8,kernel_size=9,stride=2,padding=0)self.digitcaps=DenseCapsule(in_num_caps=32*6*6,in_dim_caps=8,out_num_caps=classes,out_dim_caps=16,routings=routings)
第一部分,卷积层
这层就是标准的卷积层,256个99步长为1的kernel,输入是2828的MNIST手写数字图片,输出是2020256的feature map。
第二部分,主胶囊层
这层主要还是由卷积层组成,8组9932步长为2的kernel,输入是上层卷积层的输出2020256的feature map,输出是8组6632的feature map。然后将特征图铺成一维的,得到1152个8维的向量神经元,这是论文里说的胶囊。
第三部分,数字胶囊层
这层主要分为四步
1、全连接结构,将主胶囊层的输出做全连接,inputweight,最后得到output。output的个数就是classes的类别数。
这里主胶囊层的输出,可以将8x1的vector就是一个点,一个向量点。这里说的一个点在文中就是指u_i,而第三层的输出也可以看作是由10个神经元输出的10个点,每个点同样是向量点,其中向量的维度为16x1。在文中就是指v_j。所以第二层向第三层共输入3266=1152个点,即 i 取值为0到32x6x6=1152, 而 j 取值为从0到10, 其中第三层的每个神经元代表一类数字(0-9)出现的可能性。
2、对b_ij做softmax,得到c_ij的值,b_ij标示胶囊i到胶囊j的先验概率,初始化用0表示。c_ij表示胶囊之间的耦合程度。
3、向量压缩结果,通过squashing函数将模长压缩到0到1之间。
其中动态路由的权重更新是
b_ij+U_jiv_j
感谢
知乎上云梦居客:https://www.zhihu.com/question/67287444/answer/251460831
AI研习社对本篇论文进行了完整的翻译:https://www.zhihu.com/question/67287444/answer/252315722
https://blog.csdn.net/tangxinru123/article/details/102515251
https://github.com/XifengGuo/CapsNet-Pytorch
在学习过程中的帮助
**
