backbone之《Squeeze-and-Excitation Networks》论文阅读

不羁的心 提交于 2020-01-11 07:49:35

  论文地址:Squeeze-and-Excitation Networks
  论文代码:github

1. 简介

  SENet是207年ILSVRC分类比赛的冠军网络结构,准确的说文章中提出的结构是一个SEBlock,作为一个自学习的子模块,可以嵌入到大部分主流的网络。文中提出的网络SEResNet就是在ResNet的基础上添加了SEBlock结构。
  SEBlock现在可能的叫法为channel-wise attention(通道注意力模块),准确的来说就是在原来网络的每个bottleneck之后的feature上添加了一个权重矩阵,而这个矩阵可以增强大部分部分feature,抑制部分feature,而增强哪部分,抑制哪部分是完全是根据网络的损失自学习的。
 激活状态:
  引入了SEBlock当然会导致网络的参数量增加,但是由于SEBlock是作用于每个bottleneck后的feature,一般的网络中的bottleneck也就四五个,而SEBlock的结构本身就简单,也就意味着虽然引入了部分参数但是真实引入的参数量并不多,在可接受的范围内。
  另外说一点,这篇论文的思想很简单,但是实验很充足,有必要实验结果都看一下。

2. 网络结构

2.1 SEBlock结构

在这里插入图片描述
  上图便是SEBlock的结构,其中XRHWCX\in R^{H^{'}*W^{'}*C^{'}}是网络的输入,其中FtrF_{tr}为一些列卷积操作的集合V=[v1,v2,...,vC]V=[v_1,v_2,...,v_C]表示卷积操作,URHWCU\in R^{H*W*C}为经过一系列卷积操作的输出,U=[u1,u2,...,uC]U=[u_1,u_2,...,u_C]:
uC=vCX=s=1CvCsXs,,vCs u_C=v_C*X=\sum_{s=1}^{C^{'}}v_C^s*X^s, *是卷积操作,v_C^s是卷积在单个通道上的操作
  以上就是基本的输入输出。SEBlock分为三个部分Sequeez,Excitation, Scale。
Sequeeze:
  Sequeeze操作是将UU输出压缩成ZR11CZ\in R^{1*1*C},作者认为传统的卷积操作过于集中于局部地区,而无法提取上下文关系(context),可以通过使用GAP(global average pooling)实现这一点来作用于每个通道上来进行通道选择。
zc=Fsq(uc)=1HWi=1Hj=1Wuc(i,j) z_c=F_{sq}(u_c)=\frac{1}{H*W}\sum^{H}_{i=1}\sum_{j=1}^{W}u_c(i,j)
Excitation:
  这一步是利用具有非线性的Sigmoid激活函数保证非线性的前提下进行通道选择。
s=Fex(z,W)=σ(g(z,w))σ(W2σ(W1z)) s=F_{ex}(z,W)=\sigma(g(z,w))\sigma(W_2\sigma(W_1 z))
  公式中W1RCrC,W2RCCrW_1\in R^{\frac{C}{r}*C}, W_2\in R^{C*\frac{C}{r}}σ\sigmarelurelu,为了限制网络的复杂度,使用全连接层进行通道reduction。
Scale:
  这部分就是将学习到的通道权重应用到原有的feature上去,就是个简单的乘法。
xc~=Fscale(uc,sc)=scuc,X~=[x1~,...,xC~] \tilde{x_c}=F_{scale}(u_c, s_c)=s_cu_c,\tilde{X}=[\tilde{x_1},...,\tilde{x_C}]

2.2 实现

  SEBlock可以作为子模块插入不同的网络,作者在不同部分的选择过程中进行大量的实验进行比较选择。下面是不同网络实现的内容
在这里插入图片描述

2.2.1 SEBlock的实现

  SEBlock的实现基本结构是sequeeze + fn1 + fn2 + excitation,然后原始输入和该结构得到的通道权重相乘即可,而不同分不同实现效果不同,见下面的实验。fn1先将sequeeze得到的权重的通道降低到Cr\frac{C}{r},然再恢复到CC
Sequeeze:
  Sequeeze操作主要使用GAP(global average pooling)和GMP(global max pooling),下面是不同的选择的结果
在这里插入图片描述
Excitation:
  Excitation操作主要可用为ReLU, Tanh, Sigmoid三个操作,下面是不同操作的效果:
在这里插入图片描述
reduction:
  在具体实现中在sequeeze和excitation操作之间使用了两个全连接层先进行通道调整,而这里的通道调整比例为rr,不同的rr取值效果如下:
在这里插入图片描述
插入方式:
  SEBlock不同的插入方式:
在这里插入图片描述
在这里插入图片描述

code

class se_layer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(se_layer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)


def main():
    import numpy as np
    feature = torch.rand(1, 16,7,7)
    block = se_layer(16)
    feature = block(feature)
    print(feature)

2.2.2 网络结构

在这里插入图片描述
  上图是不同基础网络的不同实现网络结构。
模型参数量:
  使用的基础网络Resnet-50需要~3.86 GFLOPs(224 * 224输入),而对于引入使用GAP的SEBlock的SE-ResNet-50网络需要~3.87GFLOPs,只增加了0.26%,引入的参数量(即全连接层的参数量)计算公式如下:
2rs=1SNsCs2 \frac{2}{r}\sum_{s=1}^{S}N_sC_s^2
  rr表示reduction的比例,SS表示模块插入的stage数量,CsC_s输出通道,NsN_s表示stage重复次数。

3. 实验效果

3.1. 实验设置

数据:
  ImageNet 2012 (1.2M 训练图,50K验证图,1000个类别)
指标:
  top-1 error 和top-5 error
设置:

  • 数据增强:随机裁剪到224*224(299*299 inception-ResNet-v2),随机水平翻转;
  • RGB三通道normalise;
  • SGD, momentum 0.9
  • minibatch size=1024
  • learning rate=0.6,每30个epoch下降10倍

在这里插入图片描述
  不同任务的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
 激活状态:
在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!