【胶囊网络-CapsNet】胶囊网络-CapsNet原理

动机

CNN缺陷:

  • 无法从新的视角去理解对象。
    • 例如下图中,当图片角度发生变化,就会无法识别。CNN通过数据增强,即会将图片进行翻转,旋转等操作。会造成数据量变得非常大,降低训练速度。
  • 难以识别精确空间关系。
    • 比方说右图中尽管嘴巴的相对位置发生了改变,CNN仍会将其识别成人脸。

在这里插入图片描述

  • 最大池化。减少通过网络的数据的空间大小,从而增加了上层网络神经元的“视野”。
    • 丢失了大量信息,因为只有值最大的神经元会被传递到下一层,导致层与层之间信息丢失。

结论:

  1. 正确地分类和辨识对象,要对 对象部件间的分层位姿关系建模。
  2. 取代最大池化的新方法。既能保证数据空间减小,又尽量保证重要信息传递。

为什么胶囊网络就能学习到位姿信息?

在这里插入图片描述

将同一三维物体从两个不同视角的渲染出图像,作为胶囊网络的输入和输出,目标是图像重构。作者想要证明胶囊网络在处理位置、方向、尺度等方面的优势。

什么是胶囊网络

将神经元替换为胶囊就是胶囊网络。

高层胶囊和低层胶囊之间权重通过dynamic routing获得。

胶囊是一组神经元,它会学习检测给定区域图像的特定目标,它输出一个向量,向量的长度代表目标存在的概率估计,用向量的方向表示实体的属性。如果对象有轻微的变化(例如移位、旋转、改变大小等),那么胶囊将输出相同长度但方向略有不同的向量,因此,胶囊是等变化的(Equivariance)。
CNN:
在这里插入图片描述
胶囊网络:
在这里插入图片描述

CNN训练神经元来检测不同的pattern,即使是同一pattern的不同角度。使得卷积核个数和层数越来越多。

而胶囊网络希望通过一个胶囊能够识别同一类pattern。通过胶囊输出向量的长度代表目标存在的概率估计,向量的方向表示实体的属性

动态路由:通过实现分割高度重叠对象,作者证明动态路由机制是一个有效的方式。

胶囊计算方式

作者用胶囊输出向量的模长来表示一个胶囊所表征的实体在输入中出现的概率。因此作者采用一个非线性函数对向量进行“压缩”,短向量被压缩到几乎为零,长向量也被压缩到1以下长度。判别学习中充分利用这个非线性函数。
V j = ∣ ∣ s j ∣ ∣ 2 1 + ∣ ∣ s ∣ ∣ 2 s j ∣ ∣ s j ∣ ∣ (1) V_j = \frac{||s_j||^2}{1+||s||^2} \frac{s_j}{||s_j||} \tag{1} Vj=1+s2sj2sjsj(1)
其中vj是胶囊j的输出向量,sj是它的全部输入。

除了第一层胶囊,胶囊sj的全部输入是对预测向量uj|i的加权求和。这些预测向量都是由低一层的胶囊产生,通过胶囊的输出ui 和一个权重矩阵Wij相乘得来,通过矩阵乘法对视角的影响进行建模。
s j = ∑ i c i j u ^ j ∣ i u ^ j ∣ i = W i j u i s_j = \sum_i c_{ij} \hat{u}_{j|i} \\ \hat{u}_{j|i} = W_{ij} u_i sj=iciju^jiu^ji=Wijui
其中 c i j c_{ij} cij是由迭代的动态路径过程决定的耦合系数,即权重。

胶囊i和其上一层中所有胶囊的耦合系数的和为1,并由“routing softmax”决定。这个“routing softmax”的初始逻辑值bij 是胶囊i耦合于胶囊j的对数先验概率。
c i j = e x p ( b i j ) ∑ k e x p ( b i k ) c_{ij} = \frac{exp(b_{ij})}{\sum_k exp(b_{ik})} cij=kexp(bik)exp(bij)
这个对数先验可以和其他权重一起被判别学习。他们由两个胶囊的位置和类型决定,而不是当前的输入图像决定。耦合系数会从初始值开始迭代,通过测量每个高一层胶囊j的当前输出vi和低一层胶囊i的预测值ui|j之间的一致性。

所述一致性是简单的点积 a i j = v j ⋅ u ^ j ∣ i a_{ij} = v_j ·\hat u_{j|i} aij=vju^ji。这个一致性可被看做最大似然值,并在计算出所有将胶囊i连接到更高层胶囊得到的新耦合值前,加到初始逻辑值 b i j = b i j + v j ⋅ u ^ j ∣ i b_{ij} = b_{ij} + v_j ·\hat u_{j|i} bij=bij+vju^ji上。

在这里插入图片描述
在这里插入图片描述

Dynamic Routing

路由计算的伪码如下图,其中T是超参数。在这里插入图片描述
在这里插入图片描述

损失函数

margin loss

作者用胶囊向量的模长来表征的pattern的概率。对每一个表征数字k的胶囊分别给出单独的边缘损失函数(margin loss):
L c = T c m a x ( 0 , m + − ∣ ∣ v ∣ ∣ ) 2 + λ ( 1 − T c ) m a x ( 0 , ∣ ∣ v c ∣ ∣ − m − ) 2 L_c = T_c max(0, m^+ - ||v||)^2 + \lambda (1-T_c) max(0, ||v_c|| - m ^-)^2 Lc=Tcmax(0,m+v)2+λ(1Tc)max(0,vcm)2
其中Lc表示类别c的损失,Tc=1当且仅当图片中有属于类别C的数字,m+=0.9,m-=0.1。是为了减小某类的数字没有出现时的损失,防止刚开始学习就把所有数字胶囊的激活向量模长都压缩了。作者推荐选用 λ = 0.5。总损失就是简单地把每个数字胶囊的损失加起来的总和。

reconstruction loss,

通过将capsnet在digitcaps输出的10个capsule中,不是target的capsule的向量值都设为0,然后将这160维的值作为一个MLP的输入,最后得到一个784维向量,与原始输入图片的784维向量求欧氏距离,作为reconstruction loss。

CapsNet 结构

在这里插入图片描述

为什么conv1->PrimaryCaps由[20, 20, 256]->[6, 6, 8x32]呢?
卷积层是一个channel=32通道, 9x9 kernel size和strides 2的CNN,输入是20x20x256, 那么输出的size为:(20-(9-1))/2=6, 即6x6x1x32,同时呢,使用了8个不同视角的convd,最终concat为6x6x8x32

图1:一个简单的3层CapsNet。这个模型的结果能和深层卷积网络(比如. Batch-normalized maxout network in network,2015)的结果媲美。DigitCaps层每个胶囊的激活向量模长给出了每个类的实例是否存在,并且用来计算分类损失。 是PrimaryCapsules中连接每个 ui, i ∈ (1, 32 × 6 × 6) 和每个vj , j ∈ (1, 10)的权重矩阵。

图2:从DigitCaps层来重构数字的解码结构。

用掩蔽的方法只把正确的数字胶囊的激活向量保留下来。然后用这个激活向量来做重构。

训练过程中极小化图像和Sigmoid层的输出之间的欧氏距离。训练中作者们用真实的标签作为重构的目标。

实验

MINIST数据集。

在这里插入图片描述

从结果可知使用CapsNet和重构任务效果取得最好。
同时,在affnsit数据集上做测试。即测试集和训练集分布存在差异,在此测试集上,CapsNet效果下降到79%,而CNN下降到66%。

从结果上也说明,CapsNet更加鲁棒。

胶囊可视化

在这里插入图片描述

如何分析 v i v^i vi每一个维度代表一类特征,论文将 v i v^i vi通过重构网络,并每一次将v的一个维度依次增加0.05,查看其变化,通过图像观察其代表什么样的特征。

貌似也可以用来生成图像。

重构能力

在这里插入图片描述

训练集和测试集都是重叠的数字,将重叠的数字分别重构。

例如第一幅图,是2和7的重叠图案,而L表示标签是2和7,R表示重构输入2和7对应的胶囊的向量,重构出的图在下面。

discuss

  • Invariance VS Equivariance
    在这里插入图片描述

reference

  • 15
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百川AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值