论文介绍
题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
论文地址:https://arxiv.org/pdf/1910.03151
QQ深度学习交流群:719278780
扫描下方二维码,加入深度学习论文指南星球!
加入即可获得,模块缝合、制作、写作技巧,学会“结构”创新、“创新点”创新,从三区到顶会,小论文大论文,毕业一站式服务
创新点
避免通道降维:
本文通过对SENet的通道注意力模块进行剖析,发现通道降维会影响通道注意力的预测效果。因此,提出的ECA模块摒弃了通道降维,同时引入了一种局部的跨通道交互策略,从而减少了复杂度,提升了效率和效果。局部跨通道交互:
ECA模块通过基于1D卷积的方式实现跨通道交互。通过自适应地选择卷积核的大小(kernel size),该方法在保证高效性的同时,捕捉到了足够的通道间依赖性。自适应核大小选择:
提出了根据通道数量自适应地确定1D卷积核大小的非线性映射方法,避免了手动调整参数,提高了模型的鲁棒性和适应性。轻量化和高效性:
与现有的注意力模块(如SENet、CBAM等)相比,ECA模块在引入极少参数和计算量的基础上,仍然显著提升了模型的性能。例如,在ResNet-50的基础上,ECA模块只增加了80个参数和4.7e-4 GFLOPs,但提升了超过2%的Top-1准确率。通用性和广泛适用性:
ECA模块可作为轻量化的插件,适用于多种CNN架构(包括ResNet和MobileNetV2等),并在图像分类、目标检测和实例分割任务中取得了优异表现。
方法
整体架构
ECA-Net通过在传统卷积神经网络(CNN)中集成高效的ECA模块(Efficient Channel Attention Module)来增强通道注意力机制。ECA模块使用全局平均池化提取每个通道的全局特征,采用1D卷积进行局部跨通道交互,并通过自适应选择卷积核大小来平衡性能和复杂度。生成的通道权重通过Sigmoid激活对特征进行加权校准,使模型在分类、检测和分割任务中取得了显著的性能提升,同时保持极低的计算开销和参数增加。
ECA模块的核心设计体现在以下几点:
全局平均池化 (Global Average Pooling):
将每个通道的空间信息聚合为一个全局特征值,表示该通道的全局信息。
局部跨通道交互 (Local Cross-Channel Interaction):
使用1D卷积操作来进行局部通道之间的交互。1D卷积的核大小
是自适应的,根据通道数k k 通过一个非线性函数确定:C C 其中,k = nearest odd ( log 2 ( C ) / γ + b ) , k = \text{nearest odd}(\log_2(C)/\gamma + b), 和γ \gamma 是可调超参数,文中设定为2和1。b b
Sigmoid激活函数:
将经过1D卷积生成的注意力权重通过Sigmoid函数归一化,以生成通道权重。
通道加权 (Channel Recalibration):
使用生成的通道权重对原始特征进行加权,重新校准每个通道的权重以增强模型的特征表达能力。
即插即用模块作用
ECA 作为一个即插即用模块:
(1)提升通道注意力建模能力
ECA模块通过局部跨通道交互(1D卷积)捕获通道之间的依赖关系,而不增加模型复杂度,使模型能够更有效地选择重要特征。
(2)增强特征表达能力
通过校准每个通道的重要性权重,ECA模块能够:
强调重要特征通道;
抑制无关或冗余特征,从而提升特征的表达能力。
(3)提高任务性能
实验表明,ECA模块能够在多种任务中显著提升性能:
在图像分类任务中,ECA模块可使Top-1准确率提升超过2%(以ResNet-50为例)。
在目标检测任务中,ECA模块尤其对小目标检测效果提升显著(如MS COCO数据集中的APS指标)。
在实例分割任务中,ECA模块提升了对细粒度目标的分割精度。
(4)保持高效性
ECA模块通过避免通道降维和引入自适应卷积核大小,减少了不必要的计算,保证了在提升性能的同时不会增加显著的计算开销。
消融实验结果
内容:表2展示了不同设计选择(是否降维、是否包含跨通道交互等)对模型性能(Top-1和Top-5准确率)的影响。
说明:
避免降维更有效:不进行通道降维的变体(如SE-Var2和SE-Var3)性能优于采用降维的SENet。
跨通道交互的重要性:包含跨通道交互(如SE-Var3)比不包含交互的模型(如SE-Var2)性能更好。
ECA模块的优势:ECA模块以最低的模型复杂度实现了接近甚至超过SE-Var3的性能。
内容:表3对比了不同注意力机制(如SENet、CBAM、A2-Nets、GCNet、ECA)在分类任务中的性能、参数量、计算量(FLOPs)以及训练和推理速度。
说明:
性能与效率的平衡:ECA-Net在引入极少额外参数的情况下,显著提升了Top-1和Top-5准确率,且训练和推理速度接近原始ResNet。
优于其他方法:ECA模块比SENet、CBAM等模块更轻量化,同时在性能上表现优异。
即插即用模块
import numpy as np
import torch
from torch import nn
from torch.nn import init
from collections import OrderedDict
# 论文地址:https://arxiv.org/pdf/1910.03151
# 论文:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
class ECAAttention(nn.Module):
def __init__(self, kernel_size=3):
super().__init__()
self.gap=nn.AdaptiveAvgPool2d(1)
self.conv=nn.Conv1d(1,1,kernel_size=kernel_size,padding=(kernel_size-1)//2)
self.sigmoid=nn.Sigmoid()
def init_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
init.kaiming_normal_(m.weight, mode='fan_out')
if m.bias is not None:
init.constant_(m.bias, 0)
elif isinstance(m, nn.BatchNorm2d):
init.constant_(m.weight, 1)
init.constant_(m.bias, 0)
elif isinstance(m, nn.Linear):
init.normal_(m.weight, std=0.001)
if m.bias is not None:
init.constant_(m.bias, 0)
def forward(self, x):
y=self.gap(x) #bs,c,1,1
y=y.squeeze(-1).permute(0,2,1) #bs,1,c
y=self.conv(y) #bs,1,c
y=self.sigmoid(y) #bs,1,c
y=y.permute(0,2,1).unsqueeze(-1) #bs,c,1,1
return x*y.expand_as(x)
if __name__ == '__main__':
input=torch.randn(50,512,7,7)
block = ECAAttention(kernel_size=3)
output=block(input) print(output.shape)
便捷下载方式
浏览打开网址:https://github.com/ai-dawang/PlugNPlay-Modules
更多分析可见原文