SKNet:自适应感受野

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'} xRH×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^
SKNet:自适应感受野_第1张图片

fuse

fuse是利用门来控制信息流,这些信息流来自多个分支,可以将不同规模的信息传输到下一层的神经元中。
SKNet:自适应感受野_第2张图片
具体步骤:

  1. 融合不同分支的信息: U = U ˇ + U ^ U=\check{U}+\hat{U} U=Uˇ+U^;
  2. 通过简单地使用全局平均池 F q p F_{qp} Fqp来嵌入全局信息,以生成 s ∈ R C s∈R^C sRC的通道统计信息;
  3. 通过 F f c F_{fc} Ffc降维成 z ∈ R d z\in R^d zRd
    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^
SKNet:自适应感受野_第3张图片
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
SKNet:自适应感受野_第4张图片

实验

  1. 实验发现分支数D=2,分组数G=32时效果最佳。
  2. 输入object越大,SKConv越偏向于选择感受野大的的卷积核。
    SKNet:自适应感受野_第5张图片

参考代码:
1. https://github.com/pppLang/SKNet/blob/master/sknet.py
2. 空洞卷积 https://github.com/developer0hye/SKNet-PyTorch/blob/master/sknet.py

你可能感兴趣的:(深度学习,cnn,人工智能)