100天深度学习--PartA:Week3-day19 SENet

AI基础  收藏
0 / 824

10.png

简介

自动驾驶公司Momenta 提出的SENet 获得了最后一届 ImageNet 2017 竞赛 Image Classification 任务的冠军, 2.251% Top-5 错误率

它在结构中增加了一个se模块,通过Squeeze 和 Excitation 的操作,学习自动获取每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

这个模块可以灵活的加在任何结构中,而且模型和计算复杂度上具有良好的特性,在现有网络架构中嵌入 SE 模块而导致额外的参数和计算量的增长微乎其微。

基本信息

论文 "Squeeze-and-Excitation Networks "

paper:https://arxiv.org/pdf/1709.01507.pdf

作者 Jie Hu, Li Shen, Samuel Albanie, Gang Sun, Enhua Wu

翻译:https://aiqianji.com/blog/article/57

创新点

1 SE-block:增加了一个se模块,通过Squeeze 和 Excitation 的操作,学习自动获取每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

因为每个卷积提取到的特征都是一个局部特征,特征是不能利用感受野外的一些信息。作者认为通过SE-block可以对这种情况进行改善。

第一步:$F_{tr}$把输入的X映射为特征图U,$F_{tr}$可以是一个最常见的卷积层或者其他结构。

第二步:Squeeze操作对U进行一个全局的池化操作,比如最大池化或者平均池化(WxH空间范围内进行池化),产生一个embedding(1x1xC)(最大池化和平均池化同样有效,但是平均池化比最大池化的效果稍微好一点点。)
Squeeze:: Global Information Embedding 对提取到的特征,在每个通道上执行全局平均池化(global average pooling)。

第三步:Excitation操作将上面产生的embedding进行一系列非线性映射(比如FC+RELU+FC),最后跟一个sigmoid得到每个通道的权重。

Excitation: Adaptive Recalibration Excitation有两个全连接层,为了简化操作引入了参数r,r是用来减少全连接层维度的。作者希望Excitation能满足两个条件:第一,能学习到通道间的非线性关系;第二,学到的关系不一定是互斥的,这样可以多个通道特征被加强

最后,Fscale,将上面得到的每个通道的权重作用于U,对每个通道的U进行加权求和。至此,就完成了整个SE block的映射。

不同通道的权重应该自适应分配,由网络自己学习出来的

网络结构

SE blocks 的基本结构:

semodule.jpg

它可以很方便的应用在其他结构中:

对于Inception networks来说,可以把一整个Inception module当作是一个$F_{tr}$变换,加入SE block就可以得到SE-Inception network了,如下图表示。

对于residual networks来说,非直连部分可以当作是一个$F_{tr}$变换,如下图所示。

对ResNet 和ResNext加上SE结构后,如下:
senet.png

ResNet-50和SE-ResNet-50对比来说,输入$224\times 224$大小的图像,ResNet-50一次前向需要∼3.86 GFLOPs大小的计算量。对于SE-ResNet-50,里面的r取16,需要∼3.87 GFLOPs的计算量,只增加了0.26%的计算量。效果和ResNet-101近似:

SENet网络和其他网络结果对比:

源码:
caffe: caffe:https://github.com/hujie-frank/SENet
pytorch: https://github.com/moskomule/senet.pytorch

练习:在32*32 的 cifar10 上进行十分类,用pytorch构建网络结构

手写示例:

# Squeeze
    w = F.avg_pool2d(out, out.size(2))
    w = F.relu(self.fc1(w))
    w = F.sigmoid(self.fc2(w))
    # Excitation
    out = out * w

    out += shortcut

结果:
BEST ACC. PERFORMANCE :90.560%

基础

SqueezeNet

SqueezeNet 的核心在于 Fire module,Fire module 由两层构成,分别是 squeeze 层+expand 层,squeeze 层是一个 1×1 卷积核的卷积层,对上一层 feature map 进行卷积,主要目的是减少 feature map 的维数,expand 层是 1×1 和 3×3 卷积核的卷积层,expand 层中,把 1×1 和 3×3 得到的 feature map 进行 concat。

squeeze.png