SKConv
- 作者通过SKConv(选择性卷积核)来聚合多个卷积核的信息。(ps:虽然说聚合的是卷积核,但是具体的操作是含input 即特征映射的)
- SKConv由3个部分组成:split,fuse和select,它们的作用分别是生成卷积核size不同的分支、聚合不同分支信息以获得选择权重的全局的表示、根据选择权重聚合不同size核的特征映射。
split
对于input:
x
∈
R
H
′
×
W
′
×
C
′
x\in R^{H'\times W'\times C'}
x∈RH′×W′×C′,
分别进行
F
˘
、
F
^
\breve{F}、\hat{F}
F˘、F^运算,即与不同的分组/深度conv进行运算,然后计算BN、ReLU。
这些convs是size不同的卷积(例如3x3与5x5),或者是不同dilation的不同的空洞卷积,简而言之就是split成感受野不同神经元
U
ˇ
、
U
^
\check{U}、\hat{U}
Uˇ、U^。
fuse
fuse是利用门来控制信息流,这些信息流来自多个分支,可以将不同规模的信息传输到下一层的神经元中。
具体步骤:
- 融合不同分支的信息: U = U ˇ + U ^ U=\check{U}+\hat{U} U=Uˇ+U^;
- 通过简单地使用全局平均池 F q p F_{qp} Fqp来嵌入全局信息,以生成 s ∈ R C s∈R^C s∈RC的通道统计信息;
- 通过
F
f
c
F_{fc}
Ffc降维成
z
∈
R
d
z\in R^d
z∈Rd,
z = F f c ( s ) = δ ( B ( W s ) ) z=F_{fc}(s)=\delta\big(B(Ws)\big) z=Ffc(s)=δ(B(Ws)),也就是先进行一次全连接层计算,接着BN、ReLU计算;
为了研究 d d d对模型效率的影响,作者使用减小比率 γ \gamma γ来控制 d d d的值: d = m a x ( C / γ , L ) d=max(C/\gamma,L) d=max(C/γ,L),其中 L L L为 d d d的最小值.
select
select首先分别生成a、b两个矩阵作为权重,分别对
U
ˇ
、
U
^
\check{U}、\hat{U}
Uˇ、U^进行加权,然后相加
V
=
a
c
×
U
ˇ
+
b
c
×
U
^
V=a_c\times \check{U}+b_c\times \hat{U}
V=ac×Uˇ+bc×U^。
a、b是卷积后Softmax生成的,这是为了
a
c
+
b
c
=
1
a_c+b_c=1
ac+bc=1.
同理,有多个分支的时候也是所有的权重矩阵相加等于1:
f
1
c
+
f
2
c
+
f
3
c
+
.
.
.
+
f
n
c
=
1
f_{1c}+f_{2c}+f_{3c}+... +f_{nc}=1
f1c+f2c+f3c+...+fnc=1
实验
- 实验发现分支数D=2,分组数G=32时效果最佳。
- 输入object越大,SKConv越偏向于选择感受野大的的卷积核。
参考代码:
1. https://github.com/pppLang/SKNet/blob/master/sknet.py
2. 空洞卷积 https://github.com/developer0hye/SKNet-PyTorch/blob/master/sknet.py