注意力机制 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学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class