注意力机制 ECA-Net 学习记录

2023-10-13 04:30

本文主要是介绍注意力机制 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(*) 表示逐通道的全局平均池化,\sigma 为 sigmoid 激活函数,

其中,W_{1} 和 W_{2} 分别为两个 FC 层的参数,参数量分别为 C\times \frac{C}{r} 和\frac{C}{r}\times C。降维就在上面这个公式中进行,但降维破坏了通道与权重之间的直接对应关系,例如,一个单一的 FC 层使用所有通道的线性组合来预测每个通道的权重。但上面公式首先将通道特征投影到低维空间中,然后将它们映射回来,使通道与其权重之间的对应关系是间接的。

ECA

避免降维

基于上述讨论可知,SE 使得通道与权重之间的对应关系是间接的。为了验证猜想,作者将原始 SE 模块与它的三个变体(即 SE-Var1、SE-Var2 和 SEVar3)进行了比较,所有这些变体都不执行降维。如下图所示,

上图表明避免降维有助于学习有效的通道注意力。因此,作者开发了没有通道降维的 ECA 模块。

局部跨通道交互

作者探索了一种捕获局部跨通道交互的方法,保证效率和有效性。具体来说,作者使用矩阵 W_{k} 来学习通道注意力,矩阵如下:

该矩阵有 k * C 个参数,避免了不同组之间的完全独立 (使各组之间完全独立的矩阵如下)

y_{i} 的权重仅通过考虑 y_{i} 与其 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 学习记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/200749

相关文章

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程