SENet论文:https://arxiv.org/abs/1709.01507
SENet代码:https://github.com/hujie-frank/SENet
SENet 是我读的第一篇有关注意机制的文章,文章的想法非常前沿,以往人们都是在空间维度上对网络进行改进,而本文作者则是另辟蹊径,考虑特征通道之间的关系,即对特征进行重标定。这篇文章最重要是提出了SE模块,而SENet本质上是带有SE模块的ResNeXt152。
一般CNN的每个通道学习到的滤波器都对局部感受野进行操作,因此每个特征图都无法利用其它特征图的上下文信息,而且网络较低的层次上其感受野尺寸都是很小的,这样情况就会更严重。SENet通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
下图1是带有SE块的Inception块的具体结构图,右边那一大串就是我们要说的SE模块。
文中说,全局平均池化层的使用是为了解决卷积核的局部感受野无法利用区域以外的上下文信息问题,它的输出表征着在特征通道上响应的全局分布,使得靠近输入的层也可以获得全局的感受野。第一个全连接层主要的目的是降维,这可以极大地减少参数量和计算量,r是缩放因子,文中取16。后面的ReLU是使模型具有更好的非线性,可以更好地拟合通道间复杂的相关性。第二层的全连接层属于扩张层,它的输出通道又回到了原来的C,主要是为后面的权重归一化做准备。SE模块中的两层全连接层是通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。Sigmoid函数对上一步的通道进行最后的筛选,获得0~1之间归一化的权重,即越是重要的通道,它的权重就越大。最后的Scale就是特征重标定了,即将归一化后的权重加权到之前Inception输出的每个通道的特征上。至此就完成了SE模块对图像特征的筛选工作。
文中在ResNet50+SE块的这个例子说了,SE块可以在轻微增加计算复杂度的情况下,带来大幅的性能增益,并且在这个例子中,作者认为计算复杂度的增加主要在最后阶段的残差块中,所以后来作者去除了残差块的SE模块,准确率几乎没有下降,但是参数量得到了下降,因为后面的残差块输出通道比较多,一方面使得第一层的全连接层压缩不到位,另一方面给第二层的全连接层带来了过多的参数量。