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

    胶囊网络CapsNet - 图2动态路由部分介绍:

    胶囊网络CapsNet - 图3

    1. class CapsuleNet(nn.Module):
    2. def __init__(self,input_size,classes,routings):
    3. super(CapsuleNet,self).__init__()
    4. self.input_size=input_size
    5. self.classes=classes
    6. self.routings=routings
    7. self.conv1=nn.Conv2d(input_size[0],256,kernel_size=9,stride=1,padding=0)
    8. self.primarycaps=PrimaryCapsule(256,256,8,kernel_size=9,stride=2,padding=0)
    9. self.digitcaps=DenseCapsule(in_num_caps=32*6*6,in_dim_caps=8,
    10. 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。所以第二层向第三层共输入32
    66=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_ji
    v_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
    在学习过程中的帮助

    **