SENet网络

论文:《Squeeze-and-Excitation Networks》
      论文链接:https://arxiv.org/abs/1709.01507 

      代码地址:https://github.com/hujie-frank/SENet 

      PyTorch代码地址:https://github.com/miraclewkf/SENet-PyTorch

引用原文:https://blog.csdn.net/weixin_41923961/article/details/88983505 

                 https://blog.csdn.net/xjz18298268521/article/details/79078551

作者在文中将SENet block插入到现有的多种分类网络中,都取得了不错的效果。作者的动机是希望显式地建模特征通道之间的相互依赖关系。另外,作者并未引入新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

     通俗的来说SENet的核心思想在于通过网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。SE block嵌在原有的一些分类网络中不可避免地增加了一些参数和计算量,但是在效果面前还是可以接受的 。Sequeeze-and-Excitation(SE) block并不是一个完整的网络结构,而是一个子结构,可以嵌到其他分类或检测模型中。

二 网络结构

上图是SE 模块的示意图。给定一个输入 x,其特征通道数为 c_1,通过一系列卷积等一般变换后得到一个特征通道数为 c_2 的特征。与传统的 CNN 不一样的是,接下来通过三个操作来重标定前面得到的特征。

    首先是 Squeeze 操作,顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

    其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

    最后是一个 Reweight 的操作,将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

2.1 Squeeze(挤压)

        è¿éåå¾çæè¿°
  Squeeze操作就是在得到U(多个feature map)之后采用全局平均池化操作对其每个feature map进行压缩,使其C个feature map最后变成1*1*C的实数数列,如图2中红色框标记的区域就是Squeeze操作。一般CNN中的每个通道学习到的滤波器都对局部感受野进行操作,因此U中每个feature map都无法利用其它feature map的上下文信息,而且网络较低的层次上其感受野尺寸都是很小的,这样情况就会更严重。 
  U(多个feature map)可以被解释为局部描述子的集合,这些描述子的统计信息对于整个图像来说是有表现力的。论文选择最简单的全局平均池化操作,从而使其具有全局的感受野,使得网络低层也能利用全局信息。 
2.2 Excitation(激励)

      
  论文通过Excitation操作(如图2紫色框标注)来全面捕获通道依赖性,论文提出需要满足两个标准: 
    (1) 它必须是灵活的(特别是它必须能够学习通道之间的非线性交互); 
    (2) 它必须学习一个非互斥的关系,因为独热激活相反,这里允许强调多个通道。 
  为了满足这些要求,论文选择采用一个简单的gating mechanism,使用了sigmoid激活函数。其中δ是指ReLU函数(不明白为什么使用了ReLU,个人理解是为了弥补sigmoid的不足之处), 
 
  (论文厉害之处)为了限制模型复杂度和辅助泛化,论文通过引入两个全连接(FC)层(都是1*1的conv层),即降维层参数为W1,降维比例为r(论文把它设置为16),然后经过一个ReLU,然后是一个参数为W2的升维层。 

è¿éåå¾çæè¿°


最后得到1*1*C的实数数列结合U(原始缝feature map)通过公式4进行Scale操作得到最终的输出。 
               

                      
                       图2 Inception 嵌入SE block结构 
   图2所示就是SE block流程结构,给定一个输入x,其特征通道数为c_1,通过一系列卷积等一般变换后得到一个特征通道数为c_2的特征。与传统的CNN不一样的是,接下来论文通过三个操作来重标定前面得到的特征。 
   首先是Squeeze操作,顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得浅层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。 
其次是Excitation操作,它是一个类似于循环神经网络中门的机制。通过参数来为每个特征通道生成权重,其中参数被学习用来显式地建模特征通道间的相关性。 
   最后是一个Reweight的操作,我们将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

3. 附加

3.1 Excitation的作用

  论文比较有趣的地方在论文后面,作者对比不同类之间做了一些实验,阐述了Excitation在网络中不同层中的作用是不同的。 

è¿éåå¾çæè¿°

                  图4 SE-ResNet-50不同模块在ImageNet上由Excitation引起的激活 
论文对SENets中Excitation的作用提出以下三点看法: 
  首先,不同类别的分布在较低层中几乎相同,例如,SE_2_3表明在网络的最初阶段特征通道的重要性很可能由不同的类别共享。 
  当网络层数较深时,每个通道的值变得更具类别特定性,因为不同类别对特征的判别性值具有不同的偏好,例如,SE_4_6和SE_5_1这两个观察结果与以前的研究结果一致,即低层特征通常更普遍(即分类中不可知的类别),而高层特征具有更高的特异性。因此,表示特征学习从SE block的重新校准中受益,其自适应地促进特征提取和专业化。 
(没看懂)最后,论文在网络的最后阶段观察到一个有些不同的现象,例如,SE_5_2呈现出朝向饱和状态的有趣趋势,其中大部分激活接近于1,其余激活接近于0,在所有激活值取1的点处,该块将成为标准残差块。 
在网络的末端SE_5_3中(在分类器之前紧接着是全局池化),不同的类出现了尺度上只有轻微的变化的相似模式(可以通过分类器来调整)。这表明,SE_5_2和SE_5_3在为网络提供重新校准方面比前面的块更不重要,这一发现与第四节实证研究的结果是一致的。这表明,通过删除最后一个阶段的SE块,网络总体参数数量可以显著减少,而性能只有一点损失(<0.1%的top-1错误率)。
 

你可能感兴趣的:(SENet网络)