注意力机制 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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL