赞
踩
最近算是好不容易抽时间把这SE-Net论文看完了,总体来说收获还是很多的,以下是自己的一些理解和整理。
这部分作者总结了CNN神经网络效果显著的原因:原文如下:
At each convolutional layer in the network, a collection of filters expresses neighbourhood spatial connectivity patterns along input channels—fusing spatial and channel-wise information together within local receptive fields. By interleaving a series of convolutional layers with non-linear activation functions and downsam- pling operators, CNNs are able to produce robust represen- tations that capture hierarchical patterns and attain global theoretical receptive fields. Recent research has shown that these representations can be strengthened by integrating learning mechanisms into the network that help capture spatial correlations between features. One such approach, popularised by the Inception family of architectures [5], [6], incorporates multi-scale processes into network modules to achieve improved performance. Further work has sought to better model spatial dependencies [7], [8] and incorporate spatial attention into the structure of the network [9].
总结起来如下:
论文提出了一个SE(Squeeze-and-Excitation)模块,该模块主要的功能是对各个通道进行权重的分配,就像Attention一样,帮助网络把重要的特征信息学习到。
整体的框图如下:
其中X指输入,U是主干网络每一层卷积层的输出,
X
~
\tilde{X}
X~表示结合了权重之后最终的输出。
该操作是利用全局的池化,将大小为
C
×
H
×
W
C×H×W
C×H×W的输入特征综合为
C
×
1
×
1
C×1×1
C×1×1的特征描述(description),对于一张特征图来说,计算如下(后面作者对比了到底是选择平均池化还是最大池化)。
经过上述的Squeeze操作后,网络仅仅得到了一个全局描述,这个描述并不能作为该通道的权重。
因此作者提出Excitation操作,该操作主要的目的是比较全面的获取到通道级别的依赖。同时应该满足灵活和能够学习非互斥强调的能力。
基于上述的目的和要求,该操作包含了两个全连接层和Sigmoid激活函数。全连接层能够很好的融合全部的输入特征信息,而Sigmoid函数也能够很好的将输入映射到0~1区间。
该操作的公式如下:
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_1 z)})}
s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))
其中z为Squeeze操作获得的全局描述,
δ
\delta
δ表示Relu函数,保证输出为正,
W
1
,
W
2
W_1, W_2
W1,W2为两个全连接层,其中
W
1
∈
R
C
r
×
C
W_1 \in \R^{\frac{C}{r}×C}
W1∈RrC×C,
W
2
∈
R
C
×
C
r
W_2 \in \R^{C×\frac{C}{r}}
W2∈RC×rC,其中
r
r
r为缩放参数,主要用于减轻网络的计算复杂度和参数量。后面作者也对该参数进行了一些尝试。
网络经过上述Excitation之后,就获得了输入特征图U的各个通道的权重,剩下的就是将权重和原始的特征融合了,就是简单的乘法运算:
X
~
=
F
s
c
a
l
e
(
u
c
,
S
c
)
=
S
c
∗
U
c
\tilde{X}=F_{scale}(u_c,S_c)=S_c *U_c
X~=Fscale(uc,Sc)=Sc∗Uc
作者最后将SE模块添加在一些现有的主干网络中进行了实验,实验效果上看还是非常好的,不愧是2017的冠军啊!
下图是SE模块在ResNet中的添加方式:
下面是一些对比结果
可以看到效果非常的显著,不过也可以看到,在把模块放在轻量级网络中的时候,Parameter的数量增加的还是挺多的,个人感觉主要因为轻量级网络中的层数比较多,因此模块插入的数量也比较多,但是精度上确实提升了很多。
因为整个模块仅仅添加了两个全连接层,所以参数的增加很明显只有
P
a
r
a
m
=
2
r
∑
s
=
1
S
N
s
C
s
2
Param = \frac{2}{r} \sum_{s=1}^S N_s C_s^2
Param=r2s=1∑SNsCs2
其中r为缩放参数,
N
s
N_s
Ns为s层重复的次数,C_s为s层的通道数。
作者在论文中并没有对增加的计算量进行量化,仅仅给出了一些数据,其中个差别体现在上面的对比表中,整体来说增加的计算负担不是很高。
对于该系数的选择,作者使用SE-ResNet-50做了实验,数据如下:
可以看到选择16算是精度和复杂度之间的平衡。
作者对比了平均池化和最大池化,数据如下,发现平均池化是比较合适的。
作者对比了不同的激活函数,最终选择Sigmoid函数作为激活函数。
作者依旧以ResNet为实验对象,发现在每个层级添加SE模块的表现是最好的。
作者同时做了一些SE模块放置位置不同的实验,测试如下
同时,作者还做了一个实验,就是将SE模块放在bottleneck结构中的3×3卷积之后,结果如下:
整体上看,由于bottleneck结构中的通道数比较少,因此参数量减少了很多,但是对与精度的提升确实没有带来很大的提升。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。