【backbone】SENet

卷积神经网络(CNNs)的核心模块其实就是卷积操作,该操作通过融合每一层局部感受野的空间和不同通道信息来构建特征。在此之前,已经有很多的研究来实践空间的信息融合问题,希望通过去融合不同层级的特征从而增强CNNs的特征表达能力。在我们本次的工作中,我们专注于去研究不同通道之间的关系,并提出了一种新颖的结构,称为“Squeeze-and-Excitation” SE模块,该模块通过对每一个特征层的信息分别建模从而去自适应的重新定义每一个通道的特征。我们还证明了该种架构能够轻易的被移植用于其他网络架构。后续通过更多的实验,我们还发现SE模块能够以轻微的计算性能损失带来极大的准确率提升。我们的模型赢得了2017ImageNet冠军,并且是以极大的优势获得的冠军,碾压了16年的成绩。模型代码的开源地址为:https://github.com/hujie-frank/SENet

 

本文对于提升网络性能的考量点主要是从特征通道之间的关联关系入手的,为此本文提出了SE模块(并不是一个完整的网络结构,而只是一个子结构,能嵌套进其他的网络中),其重点就在于显式地建模特征通道之间的相互依赖关系。简单来讲就是通过学习的方式去自动获取每个特征通道的重要程度,然后依照这个重要程度来对特征进行重新“加权”计算,从而突出重要的特征,抑制不重要的特征。因此,我们重点就来理一下整个SE子结构的内部结构。 可以很清晰的看到整个SE模块可以分为3个步骤,首先对卷积得到特征图进行Squeeze操作,得到channel级的全局特征,然后对全局特征进行Excitation操作,学习各个channel间的关系,也得到不同channel的权重,最后乘以原来的特征图得到最终的特征。简单理解,可以把这种学习权重的过程视作是一种"attention"的方法。接下来,我们就具体看一下这俩个步骤分别做了什么。

2.1 Squeeze操作

第一步操作就是将一个channel上整个空间特征编码为一个全局特征,采用全局平均池化的方法(当然也可以有更复杂的策略),

如上图所示,其实就是对于每一个channel都提取出了一个特征,最后的输出自然也是1*1*C

2.2 Excitation操作

直接上公式,

s = F_{ex}(z,W) = \sigma(g(z,W)) = \sigma(W_2\delta(W_1z))

其中z就是Squeeze操作后得到的输出,维度为1*1*C

一步步来看,首先是第一个W_1z,表明的意思就是一个简单的全连接操作,其中W_1的维度就是\frac {C}{r} * Cr是一个缩放参数,意思就是为了减少channel的个数(减少计算量),所以第一步的输出维度就是1*1*\frac{C}{r}。然后经过一个ReLU层,输出维度不变。接着就是乘W_2,其实本质也是一个全连接层的过程,而为了让输出与之前的输入channel个数相等,这里的W_2的维度就是C*\frac{C}{r},最后的输出再经过sigmoid激活函数,得到s,其维度为1*1*C

整个过程其实简单明了,本质的核心就是去学习各个通道数之间的权重关系,如上图的颜色所示,不同颜色就代表了不同的权重。最后一步就十分简单了,就是拿这个权重去与之前的特征图进行channel-wise multiplication操作,这个应该很好理解,这里就不展开了。

至此,整一个SE模块的实现细节已经讲明白了,接下来我们具体看一下其是怎么运用在实际网络中的。

2.2 SE模块的运用

在Inception中加入SE 模块的示意图如下所示,

 

 

在ResNet中加入SE 模块的示意图如下所示,

 

其他有关训练和参数的细节这里就不展开了,有兴趣的同学可以看原论文或者看这篇博文~

3.1 总结

到这里,整篇论文的核心思想已经说清楚了。本论文主要是提出了一种新的构造特征的方法,即联系起各个channel间的关系,提出了SENet模块,并对此改进提供了充实的理论依据和实验证明,为后续发展奠定了基础。

posted @ 2021-09-09 11:41  哈哈哈喽喽喽  阅读(124)  评论(0编辑  收藏  举报