【自我学习】胶囊网络CapsNet

@【自我学习】胶囊网络CapsNet

引言

CNN进行学习时,对图片特征信息较为敏感,而最大池化又会抛弃一些有价值的信息,如位置信息。
就导致了如下图所示,只要CNN学习到了眼睛鼻子嘴的特征信息,就可以抛弃掉其位置关系,将图片认定为人脸图像。

【自我学习】胶囊网络CapsNet
如果CNN的每个神经元输出并不仅仅用一个标量值来表示某一特征,而是用向量的方式表示某个特征的方向、大小等空间信息,则可以很大程度上增强模型的学习能力

胶囊网络

原文: 《Dynamic Routing Between Capsules》
网络结构:输入层+卷积层+主胶囊层+数字胶囊层
【自我学习】胶囊网络CapsNet

卷积层

第一层卷积为普通卷积层,由256个9X9的卷积核组成,步长为1,**函数为ReLU,该层对图片提取局部特征后,作为主胶囊层的输入。

主胶囊层

PrimaryCaps

主胶囊层首先仍然使用卷积层(PrimaryCaps)
用8组步长为2的32个9X9的卷积核进一步提取特征,得到8组特征图(convolutional 8D capsules),然后将8组特征图按照对应位置拉平组合,得到1152个胶囊(向量神经元),作为数字胶囊层DigitCaps的输入

PrimaryCaps到DigitCaps使用动态路由算法

【自我学习】胶囊网络CapsNet
该算法首先对输入的向量Vi乘以权重Wi,得到ui
对ui乘以ci后求和得到s
对s进行压缩(squash),得到最终输出向量v

压缩(squash)过程:
【自我学习】胶囊网络CapsNet
其中【自我学习】胶囊网络CapsNet表示将s向量转换为该方向上的单位向量
【自我学习】胶囊网络CapsNet则表示向量在[0,1]区间的长度,s越长,该值越接近1;s越短,该值越接近0

动态路由过程:
【自我学习】胶囊网络CapsNet
对临时变量b进行初始化bij = 0,每个c(耦合系数)是由softmax(b1,b2,b3)得到的,即对c进行初始化(c的和为1)
使用第一轮的c值与ui相乘,得到第一轮s
对s进行压缩,得到第一轮a
第一轮b与a·ui相加,更新第二轮b
继续使用b对c值更新
目的:相似性越大的权重越大,相似性越小的权重越小(越像的越像,越不像的越不像)
经过N论迭代后输出向量V作为该层的输出
【自我学习】胶囊网络CapsNet
【自我学习】胶囊网络CapsNet
【自我学习】胶囊网络CapsNet
【自我学习】胶囊网络CapsNet

全连接层

【自我学习】胶囊网络CapsNet
将胶囊层输出的向量v中最大的向量输入decoder段,包含三个全连接层,该层损失函数是求最后一个sigmoid层输出的像素点与原始图像像素点的欧几里得距离。

实验

实验一

数据集:MNIST
baseline:应该是传统CNN
【自我学习】胶囊网络CapsNet
维度扰动:根据笔画粗细程度或笔画轻微改动进行重构
【自我学习】胶囊网络CapsNet
准确率99.23%的CapNet 测试准确率79%
准确率99.22%的传统CNN 测试准确率66%

实验二

数据集:multiMNIST
【自我学习】胶囊网络CapsNet
模型:3层CapNet
结果:错误率5%


自我学习,如有错误,欢迎批评指正
论文链接回头再放