单词

  1. interleaving: 交叉
  2. frontier: 前沿
  3. integrating: 集成
  4. incorporates: 包含了
  5. recalibration: 校准
  6. depicted: 描述
  7. aggregation: 聚合
  8. agnostic: 不可知论的
  9. accumulated: 积累
  10. regulating: 调节
  11. cardinality: 基数
  12. Algorithmic: 算法
  13. forgo: 放弃
  14. tackle: 解决
  15. viable: 可行的
  16. utility: 实用
  17. subsequent: 后续的
  18. exploiting: 利用
  19. mitigate: 减轻
  20. sophisticated: 复杂的
  21. criteria: 标准
  22. non mutually exclusive:非相互排斥
  23. ablation: 消融
  24. robust: 健壮的
  25. empirical: 经验

论文

《Squeeze-and-Excitation Networks》

提升CNN能力:

  • 空间信息的表征能力;
  • channel之间关系的处理;

本文主要从第二点出发,希望增强有用特征,压缩无用特征。

论文思想

image.png
上图展示的是SE-Block,通过堆叠该Block可以构造SE network。(貌似有点像LRN)

  • 对于任意将输入SE-Net_2017 - 图3转为feature maps SE-Net_2017 - 图4的转换SE-Net_2017 - 图5,SE-Net_2017 - 图6首先将会被进行压缩操作SE-Net_2017 - 图7;
  • 压缩操作实现将每个channel的feature map(SE-Net_2017 - 图8)信息进行聚合,产生channel 描述符(显然就是一个数字);
  • 然后进行激发操作SE-Net_2017 - 图9,其采用简单的自选门机制,以嵌入信息(就是上一个操作的输出)作为输入,产生每个通道的调制权值;
  • 利用通道权值信息,重新调整SE-Net_2017 - 图10得到SE-Net_2017 - 图11;

    转换函数SE-Net_2017 - 图12

    其实就是一个卷积操作。

    Squeeze压缩

    采用global average pooling:
    image.png
    其中:SE-Net_2017 - 图14表示的是输出特征SE-Net_2017 - 图15第SE-Net_2017 - 图16个channel对应的feature map,SE-Net_2017 - 图17表示压缩后的channel descriptor。

    Excitation激发

    image.png
    其中:SE-Net_2017 - 图19表示Relu激活函数,SE-Net_2017 - 图20,SE-Net_2017 - 图21。实现方式:利用两个全连接层产生botttleneck(第一个FC会使维度降低r倍,第二个FC会使维度增加回来),从而降低模型复杂度,增强模型泛化能力。
    激发之后,将会将权重分配到SE-Net_2017 - 图22中,产生SE-Net_2017 - 图23:
    image.png
    其中粗体表示向量,细体表示标量。SE-Net_2017 - 图25表示的是channel-wise的乘法操作。
    image.png image.png

    优点

  • 能够提升网络性能;

  • 增加的计算量很小;

    代码实现

    1. import torch.nn as nn
    2. class SE_Block(nn.Module):
    3. def __init__(self, ch_in, reduction=16):
    4. super(SE_Block, self).__init__()
    5. self.avg_pool = nn.AdaptiveAvgPool2d(1) # 全局自适应池化
    6. self.fc = nn.Sequential(
    7. nn.Linear(ch_in, ch_in // reduction, bias=False),
    8. nn.ReLU(inplace=True),
    9. nn.Linear(ch_in // reduction, ch_in, bias=False),
    10. nn.Sigmoid()
    11. )
    12. def forward(self, x):
    13. b, c, _, _ = x.size()
    14. y = self.avg_pool(x).view(b, c)
    15. y = self.fc(y).view(b, c, 1, 1)
    16. return x * y.expand_as(x)