SENet(Squeeze-and-Excitation Networks)论文详解

《Squeeze-and-Excitation Networks》这篇文章在17年就发布在axiv上了,最近一次修改是2019年五月,最近看用的人还是蛮多的,可能是因为效果好而且使用简单吧。

该网络其实可以理解为一个网络中的插件,可以和各种网络配合,如最基础的卷积层,resnet,inception等等。下面来看看它的实现原理。

一、SE块(SQUEEZE-AND-EXCITATION BLOCKS)

SE模块是在一个我们称为 F t r F_{tr} 的变化上建立的,其中 F t r F_{tr} 的输入为 X R H × W × C X\in R^{H'\times W'\times C'} ,输出为 U R H × W × C U\in R^{H\times W\times C}
为了便于理解,我们可以将变换 F t r F_{tr} 看成是一个简单的卷积操作,用式子 V = [ v 1 , v 2 , . . . , v C ] V=[v_1,v_2,...,v_C] 表示,其中 v c v_c 表示第c个卷积核。那么输出 U = [ u 1 , u 2 , . . . , u C ] U=[u_1,u_2,...,u_C] 能用下式表示:
u c = v c X = s = 1 C v c s x s u_c=v_c*X=\sum^{C'}_{s=1}v^{s}_{c}*x^{s}
上式中*表示卷积, v c = [ v c 1 , v c 2 , . . . , v c C ] v_c=[v^{1}_{c}, v^{2}_{c},...,v^{C'}_{c}] X = [ x 1 , x 2 , . . . , x C ] X=[x^{1}, x^{2},...,x^{C'}] ,且 u c R H × W u_c\in R^{H\times W} v c s v^{s}_{c} 是一个2D空间卷积,这里为了简化没有体现出bias。这里通过卷积层的建模,使得通道间的卷积特征有了一些隐形的提取过程。为了让通道间的特征更好的利用全局信息,在提取到的特征 U U 被送入下一层前,我们提出了两步操作,分别称为squeeze和excitation。

上述公式看起来很麻烦,SE blocks可以很形象用下图表示:
在这里插入图片描述

下面来分别介绍一下squeeze和excitation操作。

1.1 Squeeze:: Global Information Embedding

因为每个卷积提取到的特征都是一个局部特征,或者说是个局部的感受野,因此特征 U U 是不能利用感受野外的一些信息。

为了缓解这个问题,我们提出了squeeze操作。它其实就是对提取到的特征,在每个通道上执行全局平均池化(global average pooling)。用公式表示, z R C z\in R^C 是对特征 U U 在空间维度 H × W H\times W 执行全局平均池化后的结果。对于z的每一个元素表示如下:
z c = F s q ( u c ) = 1 H × W i = 1 H j = 1 W u c ( i , j ) z_c=F_{sq}(u_c)=\frac{1}{H\times W}\sum^{H}_{i=1}\sum^{W}_{j=1}u_c(i,j)

1.2 Excitation: Adaptive Recalibration

为了利用squeeze操作的信息和利用通道间的信息依赖,我们接下来使用excitation操作来完成,而且这个操作需要满足两个条件:第一,操作灵活能够获得通道间的非线性关系;第二,学到的关系不一定是互斥的,因为我们希望多个通道特征被加强,而不是像one-hot那种形式,只加强某一个通道特征。

为了满足这两个条件我们采用下式的变换形式:
s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s = F_{ex}(z, W) = \sigma(g(z, W)) = \sigma(W_2\delta(W_1z))
上式中, σ \sigma 表示sigmoid函数, δ \delta 表示relu函数, W 1 R C r × C W_1\in R^{\frac{C}{r}\times C} W 2 R C × C r W_2\in R^{C\times\frac{C}{r}} 。因为excitation操作有两个全连接层,为了简化操作引入了参数r,r是用来减少全连接层维度的。

扫描二维码关注公众号,回复: 6747297 查看本文章

得到s后,可以通过下式得到SE block的最终输出
x ~ c = F s c a l e ( u c , s c ) = s c u c \tilde{x}_c=F_{scale}(u_c,s_c)=s_{c}u_{c}
X ~ = [ x ~ 1 , x ~ 2 , . . . , x ~ C ] \tilde{X}=[\tilde{x}_1, \tilde{x}_2, ...,\tilde{x}_C]
从上式可以看出 F s c a l e F_{scale} 就是通道上的乘积, u c R H × W u_c\in R^{H\times W}

上述就是SE block的原理,可以看出SE block其实就是一个自注意力(self-attention)的函数。

二、实例化(Instantiations)

之前说是SE block非常的方便,下面来看看SE block怎么应用到各种网络中。

对于VGG来说,可以把每个卷积看成是一个 F t r F_{tr} 变换就可以了。

对于Inception networks来说,可以把一整个Inception module当作是一个 F t r F_{tr} 变换,加入SE block就可以得到SE-Inception network了,如下图表示。
在这里插入图片描述

对于residual networks来说,非直连部分可以当作是一个 F t r F_{tr} 变换,如下图所示。
在这里插入图片描述

可以看出SE block应用起来很方便,像其他的网络,如Mobilenet、Sufflenet、ResNeXt 等可以作类似的应用。

三、模型的复杂度

拿ResNet-50和SE-ResNet-50对比来说,如果输入的是 224 × 224 224\times 224 大小的图像,ResNet-50一次前向需要∼3.86 GFLOPs大小的计算量。对于SE-ResNet-50,里面的r取16,需要∼3.87 GFLOPs的计算量,可以看出只增加了0.26%的计算量。但是这时候的效果和ResNet-101差不多,效果如下表所示
在这里插入图片描述

在实际的计算中,对于一台8 NVIDIA Titan X的服务器,当batch设为256时,ResNet-50一次前向和后向的时间是190ms,而SE-ResNet-50需要209ms。推断过程中,对于cpu来说,大小为 224 × 224 224\times 224 的图像ResNet-50需要164ms,SE-ResNet-50需要167ms。

对于SE导致的参数量的计算如下公式表示
2 r s = 1 S N s C s 2 \frac{2}{r}\sum^{S}_{s=1}N_s\cdot C^2_s
上式中r是为了减少复制度的超参数,S是网络中stage的个数(可以看resnet的结构,一个stage由几个blockneck组成), C s C_s 表示输出的通道数, N s N_s 表示第s个stage中block的个数。这里没有计算bias,认为在FC层中,可以忽略不计。
SE-ResNet-50网络中相对于ResNet-50引入了∼2.5 million的参数,而原始ResNet-50就有∼25 million参数量。

相对于增加的效果,增加的参数量和计算量都是可以接受的。

SENet基本就这些内容,文章还有很多实验结果可以查看原文详细了解。

猜你喜欢

转载自blog.csdn.net/liuxiaoheng1992/article/details/93873204