本文主要是介绍注意力机制 ECA-Net 学习记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论文题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
论文链接:https://arxiv.org/pdf/1910.03151.pdf
代码链接:GitHub - BangguWu/ECANet: Code for ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
动机
CNNs 广泛应用在计算机视觉领域,如图像分类、目标检测和语义分割等,并取得了巨大的进展。从 AlexNet 开始,为了进一步提升 CNNs 的性能,研究者不断推出新的 CNN 模型。近年来,将通道注意力机制加入到卷积中引起了广泛关注。SE-Net 是代表性的方法之一,它学习每个卷积块的通道注意力,为各种深度 CNN 架构带来明显的性能提升。具体来说,给定输入特征,SE-Net 首先对每个通道使用全局平均池化,然后使用两个 FC 层,后面跟一个 sigmoid 激活函数来生成通道权重,两个 FC 层用于捕获非线性跨通道交互,其中涉及降维以控制模型复杂度。虽然这种策略在后续的通道注意力模块中得到了广泛应用,但作者通过实验证明,降维会给通道注意力预测带来副作用,并且捕获所有通道之间的依赖关系是低效且不必要的。基于 SE-Net,一些研究通过捕获更复杂的通道依赖性或结合额外的空间注意来改进网络。这些方法虽然取得了更高的准确率,但往往也会增加模型复杂度和加大计算量。与前面提到的以更高的模型复杂度为代价获得更好性能的方法不同,ECA-Net 转而关注一个问题:能否以更有效的方式学习有效的通道注意力,也就是在准确率和效率方面做一个 trade-off。ECA-Net 与现有的注意力机制模型的对比如下图所示:
创新点
(1)分别证明了避免降维和进行局部跨通道交互对于学习高性能和高效率的通道注意力是非常重要的
(2)提出了一种高效通道注意模块(ECA),在CNN网络上提出了一种轻量的通道注意力模块,该模块增加的模型复杂度很小,但提升效果显著
方法论
回归通道注意力模块 SE
SE 模块通道注意力权值计算公式如下:
其中,g(*) 表示逐通道的全局平均池化, 为 sigmoid 激活函数,
其中, 和 分别为两个 FC 层的参数,参数量分别为 和。降维就在上面这个公式中进行,但降维破坏了通道与权重之间的直接对应关系,例如,一个单一的 FC 层使用所有通道的线性组合来预测每个通道的权重。但上面公式首先将通道特征投影到低维空间中,然后将它们映射回来,使通道与其权重之间的对应关系是间接的。
ECA
避免降维
基于上述讨论可知,SE 使得通道与权重之间的对应关系是间接的。为了验证猜想,作者将原始 SE 模块与它的三个变体(即 SE-Var1、SE-Var2 和 SEVar3)进行了比较,所有这些变体都不执行降维。如下图所示,
上图表明避免降维有助于学习有效的通道注意力。因此,作者开发了没有通道降维的 ECA 模块。
局部跨通道交互
作者探索了一种捕获局部跨通道交互的方法,保证效率和有效性。具体来说,作者使用矩阵 来学习通道注意力,矩阵如下:
该矩阵有 k * C 个参数,避免了不同组之间的完全独立 (使各组之间完全独立的矩阵如下)
的权重仅通过考虑 与其 k 个邻居之间的交互来计算,公式如下:
一个更有效的方法是让所有通道共享相同的学习参数,公式如下:
注意到,上述策略可以通过内核大小为 k 的 1D 卷积轻松实现,公式如下:
局部跨通道交互覆盖
由于 ECA 模块旨在适当地捕获局部跨通道交互,因此需要确定交互的范围。可以针对各种 CNN 架构中具有不同通道数的卷积手动调整交互的优化覆盖范围。但是,通过交叉验证进行手动调优会耗费大量的计算资源。交互的覆盖范围(即 1D 卷积的内核大小 k)与通道维度 C 成正比是合理的。换句话说,k 与 C 之间存在如下映射关系:
其中,odd 表示最接近的奇数,γ 和 β 分别为 2 和 1。
深度 CNNs 中的 ECA 模块
下图展示了 ECA 模块的结构。在没有降维的情况下使用 GAP 聚合卷积特征后,ECA 模块首先自适应地确定内核大小 k,然后执行 1D 卷积,再通过 sigmoid 函数来学习通道注意力。
实验结果
在不同 CNNs 中使用不同的注意力模块的实验结果如下:
1D 卷积的内核 k 的消融实验结果如下:
在 ImageNet 上与其他 SOTA 方法的对比结果如下:
结论
作者提出了一个高效的 ECA 模块,它通过一维卷积产生通道注意力,卷积内核大小可以通过通道维度的非线性映射自适应地确定。实验结果表明,ECA 是一个非常轻量级的即插即用模块,可以提高各种 CNNs 架构的性能,包括广泛使用的 ResNets 和轻量级 MobileNetV2。此外,ECA-Net 在目标检测和实例分割任务中也表现出良好的泛化能力。
代码
import torch
from torch import nn
from torch.nn.parameter import Parameterclass eca_layer(nn.Module):"""Constructs a ECA module.Args:channel: Number of channels of the input feature mapk_size: Adaptive selection of kernel size"""def __init__(self, channel, k_size=3):super(eca_layer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False) self.sigmoid = nn.Sigmoid()def forward(self, x):# feature descriptor on the global spatial information# suppose x.shape = [1,3,112,112]y = self.avg_pool(x) # y.shape = [1,3,1,1]# Two different branches of ECA module# y.shape = [1,3,1] -> [1,1,3] -> [1,1,3] -> [1,3,1] -> [1,3,1,1]y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)# Multi-scale information fusiony = self.sigmoid(y)return x * y.expand_as(x)
这篇关于注意力机制 ECA-Net 学习记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!