Channel Attention and Squeeze-and-Excitation Networks (SENet)
-
在计算机视觉注意力机制的早期,在CVPR 2018(和TPAMI),Squeeze and Excitation Networks上发表的一篇论文介绍了一种新颖的渠道注意力机制。可以将这种简单而有效的附加模块添加到任何基准体系结构中,以提高性能,而计算开销却可以忽略不计。
在本文中,我们将分四个部分介绍挤压和激励网络。首先,我们将通过访问现代摄影技术的某些方面来理解为什么频道吸引很重要的直觉。然后,我们将继续介绍在挤压和激发(SE)块中计算频道注意力的方法。接下来,我们将剖析标准架构中的挤压和激发(SE)块的影响,同时评估它们在不同的计算机视觉任务上的作用。我们将对本文提出的方法的某些缺点进行评论。
现代摄影中的镜框选择
随着现代摄影技术在智能机制上的改进,以捕捉最佳照片而发展壮大,如今,雷达中最微妙的技术之一就是为静态照片选择最佳的照片。这是某些智能手机的常见功能。
静止照片中有很多变量。在相同的条件下和相同的环境下,相距一秒的两张拍摄对象的照片仍可能相差很大。例如,在两张照片之一中,他们的眼睛可能闭着。为了获得最佳拍摄效果,最好在拍摄照片的瞬间捕获多个帧,以便摄影师可以选择从所有捕获的帧中选择最佳帧。如今,这是以自动化,智能的方式完成的。像Google Pixel这样的智能手机能够在拍摄一张照片时从所有可用的帧中选择最佳的帧。这种智能机制受光照,对比度,模糊,背景失真等不同因素的影响。就现代卷积神经网络体系结构而言,您可以将帧视为由卷积层计算的张量中的通道。该张量通常由(B,C,H,W)维表示,其中B表示批处理大小,C表示通道,H,W表示特征图的空间尺寸(H表示特征图高度和宽度代表宽度)。通道是卷积滤波器从输入中得出不同特征的结果。但是,渠道可能不具有相同的代表重要性。由于某些渠道可能比其他渠道更重要,因此在传播到下一层之前,根据其重要性对渠道施加权重是有意义的。
我们将以此为基础来了解频道注意的重要性,我们将在以下各节中进行介绍。
Channel Attention
基于上一节中描述的直觉,让我们深入了解为什么通道注意力是提高深度卷积神经网络体系结构泛化能力的关键组成部分。
回顾一下,在卷积神经网络中,有两个主要组成部分:-
列表由尺寸(B,C,H,W)表示的输入张量(通常是四维张量)。
-
列表可训练的卷积滤波器,其中包含该层的权重。
卷积滤波器负责根据这些滤波器中学习到的权重来构建特征图。一些过滤器学习边缘,其他过滤器学习纹理,并且共同学习由输入张量嵌入的图像内目标类信息的不同特征表示。因此,通道数表示学习输入的不同特征图的卷积滤波器的数量。从我们以前对摄影中的帧选择的理解来看,这些特征图的重要性也不同。这意味着某些功能图比其他功能图更重要。例如,与学习背景纹理转换的另一个特征图相比,包含边缘信息的特征图对于学习可能更为重要和关键。因此,这是引起频道关注的基础。我们希望将这种“注意力”集中在更重要的渠道上,这基本上是要比其他渠道更重视特定渠道。最简单的方法是通过将更重要的通道缩放为更高的值。这正是Squeeze-Excitation Networks提出的建议。
Squeeze-and-Excitation Networks
在2018年,Hu等。在CVPR 2018上发表了他们的论文《挤压和激发网络》,并在TPAMI中发布了期刊版本。该论文被认为是注意力机制领域最有影响力的著作之一,迄今已获得1000多次引用。让我们看一下论文的建议。
本文提出了一种新颖,易于插入的模块,称为“挤压和激发”模块(缩写为SE-block),该模块由三个组件组成(如上图所示):- Squeeze Module
- Excitation Module
- cale ModuleS
让我们更详细地研究这些模块中的每个模块,并理解它们为什么在关注频道方面很重要。
Squeeze Module
为了获得最佳的频道关注度,人们希望特征图的缩放适应于特征图本身。概括地说,特征图集本质上是卷积层的输出张量(通常是维数(B,C,H,W)的4-D张量,其中的首字母代表批量的大小,通道,高度和宽度功能图)。为简单起见,我们仅将其视为形状(C,H,W)的3D张量-本质上,我们关注深度(张量中的通道/特征图的数量)和每个特征图的空间尺寸在那个张量中。因此,为了使频道注意力适应每个频道本身,我们有H × W总要关注的像素(或值)。从本质上讲,这意味着要使注意力真正具有适应性,您将总共使用C × H × W值进行操作。该值将变得非常大,因为在现代神经网络中,通道数量随着网络深度的增加而变大。因此,需要使用可以将每个特征图的信息分解为奇异值的特征描述符,将有助于降低整个操作的计算复杂度。
这形成了挤压模块的动机。存在许多可用于将特征图的空间尺寸减小为奇异值的特征描述符,但是在卷积神经网络中用于减小空间尺寸的通用方法是合并。有两种非常流行的池化方法:平均池化和最大池化。前者计算定义的窗口内的平均像素值,而后者计算相同定义的窗口中的最大像素值。两者都有各自的优缺点。虽然最大池保留了最活跃的像素,但它也可能非常嘈杂,并且不会考虑相邻像素。另一方面,普通池不能保留信息。但是,它可以构造该窗口中所有像素的平滑平均值。
Excitation Module
现在,将输入张量分解为较小的大小(C×1×1),该模块的下一部分将学习这些通道的自适应缩放权重。对于“挤压和激发”模块中的“激发模块”,作者选择了完全连接的多层感知器(MLP)瓶颈结构来映射缩放比例权重。这个MLP瓶颈具有相同形状的单个隐藏层以及输入和输出层。隐藏层用作缩小块,其中将输入空间缩小到由缩小因子(默认设置为16)定义的较小空间。然后将压缩空间扩展回原始尺寸,作为输入张量。用更紧凑的术语来说,可以通过以下三点来定义MLP每一层的尺寸变化:
1.输入的形状为(C ×1×1)。因此,在输入层中存在C个神经元。
2…隐藏层将其减少了减少因子r,从而导致C / r神经元总数。
3.最后,输出被投影回与输入相同的维数空间,总共返回到C个神经元。
总的来说,您传递了(C ×1×1)张量作为输入,并获得了具有相同形状的加权张量–(C ×1×1)。
理想情况下,为了改善信息传播和更好的跨通道交互(CCI),应将r设置为1,从而使其成为一个完全连接的正方形网络,每层宽度相同。但是,随着r的减小,在复杂度增加和性能提高之间需要权衡。因此,基于上表,作者使用16作为减速比的默认值。这是一个超参数,具有进一步调整范围以改善性能的范围。
Scale Module
从激励模块获得(C ×1×1)“激励”张量后,首先将其传递通过S型激活层,然后将其缩放到0-1的范围。随后,通过简单的广播逐元素乘法将输出直接应用于输入,该乘法使用来自激励模块中MLP的相应学习权重来缩放输入张量中的每个通道/特征图。作者对用作激励算子的不同非线性激活函数的影响进行了进一步的消融研究,根据结果,作者将Sigmoid确立为性能最佳的激活函数,并因此将其用作缩放模块中的默认激励算子。
总而言之,挤压激励块(SE块)采用形状为(C × H × W)的输入张量x,通过全局平均池(GAP)将其减小为形状为(C ×1×1)的张量。将这个C长度向量传递到多层感知器(MLP)瓶颈结构中,并输出相同形状的加权张量(C ×1×1),然后对其进行广播并将其与输入x逐元素相乘。
Code
- PyTorch
### Import necessary packages from torch import nn ### Squeeze and Excitation Class definition class SE(nn.Module): def __init__(self, channel, reduction_ratio =16): super(SE, self).__init__() ### Global Average Pooling self.gap = nn.AdaptiveAvgPool2d(1) ### Fully Connected Multi-Layer Perceptron (FC-MLP) self.mlp = nn.Sequential( nn.Linear(channel, channel // reduction_ratio, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction_ratio, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.gap(x).view(b, c) y = self.mlp(y).view(b, c, 1, 1) return x * y.expand_as(x)
- TensorFlow
import tensorflow as tf __all__ = [ 'squeeze_and_excitation_block', ] def squeeze_and_excitation_block(input_X, out_dim, reduction_ratio=16, layer_name='SE-block'): """Squeeze-and-Excitation (SE) Block SE block to perform feature recalibration - a mechanism that allows the network to perform feature recalibration, through which it can learn to use global information to selectively emphasise informative features and suppress less useful ones """ with tf.name_scope(layer_name): # Squeeze: Global Information Embedding squeeze = tf.nn.avg_pool(input_X, ksize=[1, *input_X.shape[1:3], 1], strides=[1, 1, 1, 1], padding='VALID', name='squeeze') # Excitation: Adaptive Feature Recalibration ## Dense (Bottleneck) -> ReLU with tf.variable_scope(layer_name+'-variables'): excitation = tf.layers.dense(squeeze, units=out_dim/reduction_ratio, name='excitation-bottleneck') excitation = tf.nn.relu(excitation, name='excitation-bottleneck-relu') ## Dense -> Sigmoid with tf.variable_scope(layer_name+'-variables'): excitation = tf.layers.dense(excitation, units=out_dim, name='excitation') excitation = tf.nn.sigmoid(excitation, name='excitation-sigmoid') # Scaling scaler = tf.reshape(excitation, shape=[-1, 1, 1, out_dim], name='scaler') return input_X * scaler
缺点
尽管本文本身具有革命性意义,但它在结构上存在某些概述的缺陷,并存在一些不确定的设计策略。-
该方法非常昂贵,并且在基线模型的基础上添加了大量参数和FLOPS。尽管在宏伟的方案中,开销可能很小,但是有许多新方法旨在以极低的成本提供频道关注,其效果要比SENets更好,例如ECANet(在CVPR 2020年发布)。
-
尽管就参数和FLOP开销而言,通道注意似乎是有效的,但一个主要缺陷是缩放操作,在该操作中,广播加权通道矢量并将其逐元素地应用/乘以输入张量。该中间广播张量具有与输入相同的维数空间,从而导致存储器复杂度的大幅增加。这使训练过程变慢并且占用更多的内存。
-
为了降低计算复杂度,该块的激励模块的MLP中存在瓶颈结构,其中通道数以指定的缩小率减少。这导致信息丢失,因此是次优的。
-
由于SENet仅通过使用专用的全局特征描述符(在本例中为全局平均池(GAP))来提供频道关注,因此信息丢失并且提供的关注是针对性的。这意味着所有像素均均匀地映射在特征图的空间域中,因此无法区分重要或类别确定性像素与属于背景或不包含有用信息的像素。因此,将空间关注的重要性/需要与频道关注结合起来是合理的。相同的主要示例之一是CBAM(在ECCV 2018上发布)。
-
有关SENet的设计策略尚无定论。作者指出,这超出了本文的范围,无法理解最佳设置,包括SE模块的位置集成策略和MLP中使用的缩小率。
References
Squeeze-and-Excitation Networks, TPAMI 2018.
CBAM: Convolutional Block Attention Module, ECCV 2018.
ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks, CVPR 2020.
SENet original repository. -