文章目录
- 前言
- capsule network
- 参考
前言
capsule network 可以简单理解为将神经网络的标量计算,赋予了方向,变换成了向量进行计算。
标量只有大小之分。
向量不仅有大小,还有方向之分。
应该可以略微感受到这种思路的魔力了。
capsule 主要是能够改进CV里CNN对特征提取。因为对于同类事务,CNN经过maxpooling得到最后的结果基本相同,就相当与是不同的输入得到了相同的输出,这其实是不利于泛化能力提高的。
就比如上面的鸟嘴,如果是传统CNN特征提取,两幅图得出的结果可能是一模一样的,但是如果使用capsule,那么可能二者得出的结果大小相等,方向相反,那么还是有本质区别的,也就是说capsule可以用于解决CNN中图像位置信息缺失的问题。
再比如说:
这两张图片都是表示1,不过方向不同,或者说位置不同,那么得出的v1 向量表示应该是不同的,但是向量的模长可以是相同的,这样就能够使得模型能够拥有更好的泛化性了。
那么如何进行capsule的计算呢?
通过这幅图大概就能略知一二了。
capsule network
capsule的计算的基本过程如下图所示:
这里是只有两个向量进行计算的形式。
首先输入向量v1 和 v2
然后经过W进行特征变换得到u
然后各自乘以一个系数c加起来得到s向量
然后经过squashing的操作,就类似于激活函数一样的作用,在这里还会约束他模长。
值得注意的是,这里的c1+c2 = 1
capsule network有个重要的思想就是动态路由,简单来说就是c并不是固定的,而是动态调整的。
调整思路如下:
这里看输入向量为3的一个capsule,如何进行调整c。
T表示路由动态调整的次数
最开始,初始化b都为0
然后c经过softmax进行得到c,这样保证c为正且和为1
还记得u是输入向量v线性变换后的结果
然后计算s
经过squash后得到a
然后根据计算的结果调整b,从而动态的调整c
这就是动态路由了。
算法的作用应该就是当输入向量和大部分的向量的都不像的时候,那么他的c就会变得越来越小,相当于“排除异己”的一种动态策略。
可以再看一遍图示的计算过程:
调整了两次c,(初始也算一次)
调整了第3次c
这样就得到最终的结果了。
那么对于分类的预测该怎么办呢?
答案是使用向量的模长作为分类标签的置信度,置信度最大的就是最终的类别了。
然后文章里还提到采用重构数据来帮助模型训练,那么重构误差就是对应的数字进行重构误差的传播,例如数字1则就对capsule1的进行误差传播,否则都为0.
然后我们可以看看实验结果:
一个有意思的点就是,当调整向量某些维度时,呈现出的数字确实有微妙的变化:
说明capsule network 确实是有点作用的。
好了我们接下来看看原文讲的算法公式,复盘一下,应该就比较好理解了
这就是动态路由计算。
非线性变化的squashing的定义。
特征经过W变换然后加权求和得到s
c的计算方式
代码也是比较简单:https://github.com/naturomics/CapsNet-Tensorflow
参考
【 深度学习李宏毅 】 Capsule(中文)
https://github.com/naturomics/CapsNet-Tensorflow
Dynamic Routing Between Capsules