SENet:通道维度的注意力机制

0.引言

SENet于2017.9提出,其通过显式地建模卷积特征通道之间的相互依赖性来提高网络的表示能力。即通道维度上的注意力机制。SE模块仅需微小的计算成本,却产生了显著的性能改进。SENet Block与ResNeXt的结合在ILSVRC2017比赛中获得了第一名。

论文名称:Squeeze-and-excitation networks

下载地址:https://arxiv.org/pdf/1709.01507.pdf

1.SENet模型总览

提出背景:卷积核通常被视为在局部感受野内,在空间和通道维度上同时对信息进行相乘求和的计算。然而,现有的许多网络大多数都是通过在空间维度上进行特征融合(如Inception的多尺度)来提高性能,而忽略了通道维度的重要性。

通道维度的注意力机制:在常规的卷积操作中,输入信息的每个通道进行计算后的结果会进行求和输出,这时每个通道的重要程度是相同的。而通道维度的注意力机制,则通过学习的方式来自动获取到每个特征通道的重要程度(即特征图层的权重),以增强有用的通道特征,抑制不重要的通道特征。提到卷积对通道信息的处理,有人或许会想到逐点卷积,即核大小为1×1的常规卷积。与1×1卷积相比,SENet则是为每个通道重新分配一个权重(即重要程度)。而1×1卷积只是在做通道的融合计算,同时进行升维和降维,每个通道在计算时的重要程度是相同的。

2.SE(Squeeze and Excitation)模块

SENet是一种基于注意力机制的卷积神经网络架构。其主要思想是通过自适应地重新校准卷积特征的通道响应。SENet中的压缩操作(Squeeze)和激励操作(Excitation)分别对应着该过程的两个主要步骤:

Squeeze:压缩操作是全局信息嵌入的过程,主要用于对空间维度进行全局平均池化,得到每个通道的全局空间信息,形成一个通道描述符。换句话说,通过这个操作,可以获得每个特征通道的全局上下文信息。

Excitation:激励操作是通过一个全连接层来学习非线性交互,以便捕获特征通道之间的依赖关系。具体来说,首先通过一个全连接层对通道描述符进行降维(通常通过一个收缩因子进行降维,例如16),然后通过ReLU激活函数进行非线性变换,接着再通过一个全连接层恢复到原始维度,并通过Sigmoid激活函数将其映射到0到1之间,得到每个通道的权重。这个权重就可以用来重新校准原始特征通道。

通过这种方式,SENet可以有效地模拟特征通道之间的依赖关系,并且能够动态地调整每个特征通道的权重,从而提高模型的表现。网络结构如图1所示。

(1)输入X经过一系列传统卷积得到特征图U,对U先做一个全局平均池化,输出的1×1×C数据,这个特征向量一定程度上可以代表之前的输入信息,论文中称之为压缩操作(Squeeze)。

(2)再经过两个全连接来学习通道间的重要性,用Sigmoid限制到[0, 1]的范围,这时得到的输出可以看作每个通道重要程度的权重,论文中称之为激励操作(Excitation)。

(3)最后,把这个1×1×C的权重乘到U的C个通道上,这时就根据权重对U的通道进行了重要程度的重新分配。

图片[1]-SENet:通道维度的注意力机制-点头深度学习网站
图1 SENet模块

SENet模块的代码如下:

class SEModule(nn.Module):    
    def __init__(self, channels, reduction):    
        super(SEModule, self).__init__()    
        self.avg_pool = nn.AdaptiveAvgPool2d(1)    
        self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1, padding=0)    
        self.relu = nn.ReLU(inplace=True)    
        self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1, padding=0)    
        self.sigmoid = nn.Sigmoid()   

    def forward(self, x):    
        module_input = x    
        x = self.avg_pool(x)    
        x = self.fc1(x)    
        x = self.relu(x)    
        x = self.fc2(x)    
        x = self.sigmoid(x)    
        return module_input * x

3.SENet效果

SE模块可以嵌入到现在几乎所有的网络结构中,而且都可以得到不错的效果提升,“用过的都说好”。

在大部分模型中嵌入SENet要比非SENet的准确率更高出1%左右,而计算复杂度上只是略微有提升,具体见表1。

图片[2]-SENet:通道维度的注意力机制-点头深度学习网站
表1 SENet结合经典的基线模型

4.SENet模型小结

SENet模型是一种通过自适应地重新加权输入特征图的通道来增强模型表达能力的卷积神经网络结构。由胡杰等人在2018年提出。

SENet的核心思想是通过一个Squeeze-and-Excitation模块来学习输入特征图的通道之间的关系,从而自适应地调整特征图中每个通道的权重。具体来说,Squeeze-and-Excitation模块包含两个步骤:

Squeeze:压缩操作通过全局池化操作,将输入特征图的每个通道压缩成一个标量,用于表示该通道的重要性。

Excitation:激励操作使用一个小型的全连接神经网络,学习一个激活函数,将上一步中得到的每个通道的重要性进行自适应调整,并重新加权输入特征图的通道。

通过这样的操作,SENet可以自适应地增强模型的表达能力,减少冗余信息的传递,并且在不增加网络复杂度的情况下提高模型的准确率。此外,SENet可以很容易地嵌入到其它深度卷积神经网络结构中,使得其更容易应用于实际的计算机视觉任务中。

SENet模型在许多视觉任务中都取得了出色的表现,比如在ImageNet图像分类任务中,SENet-154取得了迄今为止最好的单模型结果。同时,SENet还被广泛应用于各种其它视觉任务中,如目标检测、语义分割等。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容