近期对有关注意力机制的两篇文章进行了解读。分别是可以嵌入到很多网络结构中去的SE block的提出论文SENet,以及在GAN生成领域引入注意力机制的SAGAN。这两篇文章都是很经典的文章,这里将其详细整理一下。
SE Net:Squeeze-and-Excitation Networks (CVPR2018)
这篇文章的主要贡献是对通道间的依赖关系、各通道特征的权重进行了学习和分配。
卷积神经网络(CNN)的核心构件是卷积运算符,它使网络在每一层的局部接受域内融合空间和通道信息构造信息特征。很多现有的研究都试图通过在整个特征层次上提高空间编码的质量来增强CNN的特征表达能力。在SENet中,将重点放在通道间关系上,提出一个新颖的架构单元,“squeeze和excitation”(SE block),通过显式建模通道(channel)之间的相互依赖性来自适应地重新校准通道特征的响应。
SEnet是2017年由Momenta在提出的全新图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。在ILSVRC 2017分类比赛中获得冠军,在ImageNet数据集上将top-5 error降低到2.251%,相对于2016年的冠军有了约25%的提升(2.991%)。
论文:Squeeze-and-Excitation Networks
论文链接:https://arxiv.org/abs/1709.01507
作者Caffe代码地址:https://github.com/hujie-frank/SENet
PyTorch代码地址:https://github.com/miraclewkf/SENet-PyTorch
(1)、主要原理和结构
分Squeeze和excitation两块儿。SE block的结构图如下,
其中,Ftr为传统的卷积特征提取结构,X和U为其输入和输出,,
。计算公式为,
这与之前的卷积结构相同,SE block增加的在后面阶段。Squeeze操作即Fsq,目的是为了在后面的全连接层处理之前,先对全局信息进行一个融合,实际上是做了一个Global Average Pooling操作(在pytroch中,对U的W和H做平均池化;在Ttensorflow中有两种实现方式,分别为直接使用tf.reduce_mean()和使用 from tflearn.layers.conv import global_avg_pool,直接用global_avg_pool)。全局平均池化得到1*1*C的数据。随后进行excitation操作,包括FC(1*1*C/r,不使用bias)--> ReLu -->FC(1*1*C,不使用bias) --> Sigmoid。使用Sigmoid将特征值限制在[0,1]范围内。最后Scale后的值与特征U中C个通道分别相乘,作为下一级输入。通过网络对Scale值的学习,增强重要特征,减弱不重要特征,使得提取的特征指向性更强。
下面是pytorch版本的SE block实现代码:
from torch import nn
class SELayer(nn.Module):
def __init__(self, channel, reduction=16):
super(SELayer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channel, channel // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channel // reduction, channel, bias=False),
nn.Sigmoid()
)
def forward(self, x):