首先将输入的
c
c
c 通道特征分成
c
−
c
c-c
c−c’ 以及
c
′
c'
c′ 个通道;然后通过几个卷积层去获取 high level 的特征表示;接下来将这两个分支 concate 起来保持与输入通道 c 相同的通道维度;最后采用了一个 channel shuffle 算子来建立两个分支之间的 communication。为了加速运算, SGE 提出了一种分组策略,可以将输入的特征图分入多个组,方便进行并行的计算操作,以便将多个组的 sub-features 进行并行地提升操作。
给定特征
X
∈
R
C
×
H
×
W
X\in \R^{C×H×W}
X∈RC×H×W,将特征按照通道分成
G
G
G 个组
X
=
[
X
1
,
X
2
,
.
.
.
,
X
G
]
,
X
k
∈
R
C
/
G
×
H
×
W
X=[X_1,X_2,...,X_G],X_k \in \R^{C/G×H×W}
X=[X1,X2,...,XG],Xk∈RC/G×H×W 每一个 sub-feature
X
k
X_k
Xk 都会在训练过程中逐渐获得一个特殊的语义相应(gradually captures a specific semantic response)
然后,我们通过注意力模块为每个子特征生成相应的重要性系数。特别的,在 attention 开始的时候,对于每一个组中的
X
k
X_k
Xk 都分成两个部分
X
k
1
,
X
k
2
∈
R
C
/
2
G
×
H
×
W
X_{k1},X_{k2} \in \R^{C/2G×H×W}
Xk1,Xk2∈RC/2G×H×W
这每个 group 中被切分成的两部分,一个分支利用通道间的相互关系生成 channel attention,而另一个分支利用特征的空间关系生成 spatial attention,从而使模型专注于“what”和“where”。
channel attention(通道 attention)
为了克服 SE 通道 attention 中存在的弊端,本文采用了一种可选择的方式,这种方式首先采用 global average pooling 来产生 channel-wise 的数据,维度为
R
C
/
2
G
×
1
×
1
\R^{C/2G×1×1}
RC/2G×1×1,公式表示为:
这个公式表示的就是,对于
X
k
1
X_{k1}
Xk1 沿着通道的维度,对每个通道的特征图进行求和得到一个值,然后除以这个图的点的数量,即:对特征图的每个通道进行加和求平均,并用这个值来代替这个通道的特征信息
然后通过
F
c
F_c
Fc 进行运算,并通过 sigmoid 进行激活来产生每个通道对应的 attention 权重
其中
F
c
(
⋅
)
F_c(·)
Fc(⋅) 运算就是对
s
s
s 乘了一个矩阵
W
1
∈
R
C
/
2
G
×
1
×
1
W_1 \in \R^{C/2G×1×1}
W1∈RC/2G×1×1 再加一个偏置
b
1
∈
R
C
/
2
G
×
1
×
1
b_1\in \R^{C/2G×1×1}
b1∈RC/2G×1×1 他们的作用是来 scale 放缩和转换shift
s
s
s
整个 channel attention 部分的代码如下
空间 attention(spatial attention)
空间 attention 关注的是 “where” 即,“看哪里” 的问题
首先先用一个 group_norm (GN) 对
X
k
2
X_{k2}
Xk2 进行处理来获得 spatial-wise 的数据。
接着使用
F
c
(
⋅
)
F_c(·)
Fc(⋅) 来提升
X
k
2
^
\hat{X_{k2}}
Xk2^,最终 spatial attention 被表示为:
接下来将两个特征
X
k
1
,
X
k
2
X_{k1},X_{k2}
Xk1,Xk2 进行结合 aggregation
Aggregation
类似 shufflenetv2,我们采用“channel shuffle” 算子来实现跨组信息(cross_group)沿着通道维度流动。 SA 模块的最终输出与
X
X
X 大小相同,使 SA 很容易与现代架构集成
W
1
,
b
1
,
W
2
,
b
2
W_1,b_1,W_2,b_2
W1,b1,W2,b2 和 Group Norm 超参数只是在 SA 中引入的参数。
因为
X
k
1
,
X
k
2
X_{k1},X_{k2}
Xk1,Xk2 分别是有
C
/
2
G
C/2G
C/2G 的通道数,再加上
W
,
b
W,b
W,b 引入的参数,可得到总的参数数量为
3
C
/
G
3C/G
3C/G,这与网络结构数百万的参数相比可以说是微乎其微的,所以 SA 模块是非常的轻量级模块