注意力机制 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深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.