这篇论文提出了一种称为scSE(Concurrent Spatial and Channel `Squeeze & Excitation') block的神经网络,它可以应用在CNN的任意层,用于增强CNN编码空间信息(spatial encoding)能力,提高CNN的图像识别能力。
在Kaggle image segmentation比赛--TGS Salt Identification Challenge中,它帮助我的ResNet34+U-Net模型在LB上的得分提升了0.032,排名提升了50+位。
SE(Squeeze & Excitation) Network / Paper
scSE的灵感源于SE block,因此,有必要先了解SE block。
Figure 1是SE block的架构图,是常规的CNN layer,是'Squeeze & Excitation'中的'Squeeze',通过global pooling函数将矩阵U(H x W x C)压缩为1 x 1 x C的通道向量。则是'Excitation',通过全连接层(FC)的训练得到每个通道的重要性(by sigmoid),最终根据excitation来校准采样(feature recalibration),即调整特征矩阵的值: U * excitation(1 x 1 x C)。
ResNet、Inception等CNN的工作原理是相似的:
- 首先,通过卷积层来提取图像特征
- 将特征矩阵压缩成特征向量(adaptive global pooling)
- 通过训练全连接层来找到特征与分类的关联
- 最终计算出样本对应所有分类的概率
由此可知,图像特征的提取能力是CNN的核心能力,而SE block可以起到为CNN校准采样的作用。以Figure 3为例,图像样本有两个分类:[人, 酒瓶]。根据感受野(Receptive Field)理论,特征矩阵主要来自于样本的中央区域,处在边缘位置的酒瓶的图像特征很大概率会被pooling层抛弃掉。SE block的加入就可以通过来调整特征矩阵,增强酒瓶特征的比重,提高它的识别概率。
scSE Network
理解了SE之后再看scSE就简单多了,scSE在SE的基础上提出cSE、sSE、scSE这三个变种。cSE和sSE分别是根据通道和feature map cell的重要性来校准采样。scSE则是同时进行两种不同采样校准,并将它们的结果结合起来使用。
class SCSEModule(nn.Module):
def __init__(self, ch, re=16):
super().__init__()
self.cSE = nn.Sequential(nn.AdaptiveAvgPool2d(1),
nn.Conv2d(ch,ch//re,1),
nn.ReLU(inplace=True),
nn.Conv2d(ch//re,ch,1),
nn.Sigmoid())
self.sSE = nn.Sequential(nn.Conv2d(ch,ch,1),
nn.Sigmoid())
def forward(self, x):
return x * self.cSE(x) + x * self.sSE(x)
END
本文分析了scSE工作原理:它可以帮助校准CNN的图像特征采样区域,提高CNN图像识别能力。