参考博客:https://blog.csdn.net/qixutuo6087/article/details/88822428
pytorch代码:https://github.com/pppLang/SKNet
1. 为什么提出该网络?
当我们在距离目标不同远近程度看一个物体时,我们的视觉皮层神经元会选择不同的接受域来感受该物体。因此,本文提出一种动态选择机制使每一个神经元可以针对目标物体的大小选择不同的感受野。
每一个SK单元中用不同的卷积核提取特征,然后通过每个分支引导的不同信息构成的softmax进行融合。SK单元包括三个方面:Split, Fuse, Select。它的优点在于可以捕捉到不同尺寸的目标物体。
Split阶段使用不同的卷积核对原图进行卷积。
Fuse运算符组合并聚合来自多个路径的信息,以获得选择权重的全局和综合表示。
Select运算符根据选择权重聚合不同大小的内核的特征映射。
多个SK单元组成了SKNet。
2. SKNet模型
2.1 Split
首先对输入用不同的卷积核进行卷积操作。在本文,选取的3x3和5x5卷积,得到输出Uˆ和U^。为了进一步的效率,我们将5x5的传统卷积替代为dilation=2,卷积核为3x3的空洞卷积。
2.2 Fuse
该步骤主要通过门控机制将上一层的输出进行有选择的筛选,使每一个分支都携带不同的信息流进入下一个神经元。
首先对不同分支的输出进行融合,即逐元素进行相加。(这意味着输出的尺寸和通道数必须是一样的)
其次,对两个输出进行全局平均池化(global average pooling )操作,获得每一个通道上的全局信息。该步骤和SENet的Squeeze操作相同。(输出s:C维)。
然后对输出s做全连接,目的是找到每一个通道占的比重大小。其中B代表BN,批正则化处理,δ代表RELu。通过d来学习模型的有效性,C/r相当于对模型降维,但不能降到比L还小,文中将L设置为32。(W:d x C维;Ws:d维;z:d维)
2.3 Select
Select操作对应于SE模块中的Scale。用softmax方式对每一个通道计算概率值。(Ac:C x d维;Acz:C维,相当于先对s降维,后对z升维。)
在两个分支中,矩阵B是冗余的,因为 ac + bc = 1。使用两个权重矩阵对两个输出的分支进行加权操作,在进行逐像素相加,得到输出V。(V:H X W X C维)
文中只是提出了双分支的情况,我们也可以扩展到更多分支。