【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)
CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目标是通过在CNN中引入通道注意力和空间注意力来提高模型的感知能力,从而在不增加网络复杂性的情况下改善性能。
1、概述
CBAM旨在克服传统卷积神经网络在处理不同尺度、形状和方向信息时的局限性。为此,CBAM引入了两种注意力机制:通道注意力和空间注意力。通道注意力有助于增强不同通道的特征表示,而空间注意力有助于提取空间中不同位置的关键信息。
2、模型结构
CBAM由两个关键部分组成:通道注意力模块(C-channel)和空间注意力模块(S-channel)。这两个模块可以分别嵌入到CNN中的不同层,以增强特征表示。
2.1 通道注意力模块

通道注意力模块的目标是增强每个通道的特征表达。以下是实现通道注意力模块的步骤:
-
全局最大池化和全局平均池化: 对于输入特征图,首先对每个通道执行全局最大池化和全局平均池化操作,计算每个通道上的最大特征值和平均特征值。这会生成两个包含通道数的向量,分别表示每个通道的全局最大特征和平均特征。
-
全连接层: 将全局最大池化和平均池化后的特征向量输入到一个共享全连接层中。这个全连接层用于学习每个通道的注意力权重。通过学习,网络可以自适应地决定哪些通道对于当前任务更加重要。将全局最大特征向量和平均特征向相交,得到最终注意力权重向量。
-
Sigmoid激活: 为了确保注意力权重位于0到1之间,应用Sigmoid激活函数来产生通道注意力权重。这些权重将应用于原始特征图的每个通道。
-
注意力加权: 使用得到的注意力权重,将它们与原始特征图的每个通道相乘,得到注意力加权后的通道特征图。这将强调对当前任务有帮助的通道,并抑制无关的通道。
代码实现:
class ChannelAttention(nn.Module):"""CBAM混合注意力机制的通道注意力"""def __init__(self, in_channels, ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.fc = nn.Sequential(# 全连接层# nn.Linear(in_planes, in_planes // ratio, bias=False),# nn.ReLU(),# nn.Linear(in_planes // ratio, in_planes, bias=False)# 利用1x1卷积代替全连接,避免输入必须尺度固定的问题,并减小计算量nn.Conv2d(in_channels, in_channels // ratio, 1, bias=False),nn.ReLU(inplace=True),nn.Conv2d(in_channels // ratio, in_channels, 1, bias=False))self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.fc(self.avg_pool(x))max_out = self.fc(self.max_pool(x))out = avg_out + max_outout = self.sigmoid(out)return out * x
2.2 空间注意力模块

空间注意力模块的目标是强调图像中不同位置的重要性。以下是实现空间注意力模块的步骤:
- 全局最大池化和全局平均池化: 对于输入特征图,分别执行全局最大池化和全局平均池化操作,生成不同上下文尺度的特征。
- 连接和卷积: 将全局最大池化和全局平均池化后的特征沿着通道维度进行连接(拼接),得到一个具有不同尺度上下文信息的特征图。然后,通过卷积层处理这个特征图,以生成空间注意力权重。
- Sigmoid激活: 类似于通道注意力模块,对生成的空间注意力权重应用Sigmoid激活函数,将权重限制在0到1之间。
- 注意力加权: 将得到的空间注意力权重应用于原始特征图,对每个空间位置的特征进行加权。这样可以突出重要的图像区域,并减少不重要的区域的影响。
代码实现:
class SpatialAttention(nn.Module):"""CBAM混合注意力机制的空间注意力"""def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size in (3, 7), 'kernel size must be 3 or 7'padding = 3 if kernel_size == 7 else 1self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)out = torch.cat([avg_out, max_out], dim=1)out = self.sigmoid(self.conv1(out))return out * x
2.3 混合注意力模块

CBAM就是将通道注意力模块和空间注意力模块的输出特征逐元素相乘,得到最终的注意力增强特征。这个增强的特征将用作后续网络层的输入,以在保留关键信息的同时,抑制噪声和无关信息。原文实验证明先进行通道维度的整合,再进行空间维度的整合,模型效果更好(有效玄学炼丹的感觉)。
代码实现:
class CBAM(nn.Module):"""CBAM混合注意力机制"""def __init__(self, in_channels, ratio=16, kernel_size=3):super(CBAM_Block, self).__init__()self.channelattention = ChannelAttention(in_channels, ratio=ratio)self.spatialattention = SpatialAttention(kernel_size=kernel_size)def forward(self, x):x = self.channelattention(x)x = self.spatialattention(x)return x
总结
总之,CBAM模块通过自适应地学习通道和空间注意力权重,以提高卷积神经网络的特征表达能力。通过将通道注意力和空间注意力结合起来,CBAM模块能够在不同维度上捕获特征之间的相关性,从而提升图像识别任务的性能。
相关文章:
【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)
CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主…...
【资料分享】全志科技T507-H工业核心板规格书
1 核心板简介 创龙科技SOM-TLT507是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53全国产工业核心板,主频高达1.416GHz。核心板CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案,国产化率100%。 核心板通过邮票孔连接方式引出MIPI C…...
Profibus-DP转modbus RTU网关modbus rtu和tcp的区别
捷米JM-DPM-RTU网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:EH流量计、倍福编码器等)接入到Modbus网络中;通过增加DP/PA耦合器,也可将Profibus PA从站接入…...
AlmaLinux 9 安装 Edge 和 Chrome
AlmaLinux 9 安装 Edge 和 Chrome 1. 安装 Edge2. 安装 Chrome 1. 安装 Edge 更新源, sudo dnf update -y # sudo dnf install dnf-utils -y添加 Edge 源, sudo dnf config-manager --add-repo https://packages.microsoft.com/yumrepos/edge再次更新…...
NGINX——负载均衡
负载均衡————>通过反向代理来实现 nginx反向代理的七层代理和四层代理 七层代理: 七层代理时最常用的反向代理方式,其只能配置在nginx的配置文件的http模块中,而且方法名称必须要定义成“upstream”模块,注意不能写在se…...
C#实现端口扫描和执行cmd命令、调用摄像头
C#端口扫描 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading;namespace PortScanner {class Program{static void Main(string[] args){// 设置扫描参数string host "localho…...
【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Qt 使用QLabel的派生类实现QLabel的双击响应
1 介绍 在QLabel中没有双击等事件响应,需要构建其派生类,自定义信号(signals)、重载事件函数(event),最后在Qwidget中使用connect链接即可,进而实现响应功能。 对于其余没有需求事件响应的QObject同样适用。 此外,该功…...
关于@JSONField的使用
1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上,如下: ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…...
Centos7单机部署ElasticSearch
Centos7单机部署ElasticSearch 引言 Elasticsearch是一种广泛使用的开源搜索引擎,专门为分布式环境设计,但也可以在单机上运行。它使存储、搜索和分析大量数据变得更加容易和高效。此教程将引导你通过在Centos7上单机部署Elasticsearch,涵盖…...
js玩儿爬虫
前言 提到爬虫可能大多都会想到python,其实爬虫的实现并不限制任何语言。 下面我们就使用js来实现,后端为express,前端为vue3。 实现功能 话不多说,先看结果: 这是项目链接:https://gitee.com/xi1213/w…...
新利好带动 POSE 持续上扬,月内几近翻倍
PoseiSwap 是 Nautilus Chain 上的首个 DEX,得益于 Nautilus Chain 的模块化 Layer3 构架,PoseiSwap 正在基于 zk-Rollup 方案构建全新的应用层,并基于此构建隐私、合规等全新的特性,为未来其布局 RWA 领域推动 Web2、Web3 世界的…...
Windows terminal 添加 git bash 解决git中文乱码显示问题
Windows terminal 添加 git bash 解决git中文乱码显示问题 在 windows terminal 中配置git 说明: 点击箭头选择设置 说明: 点击"添加新配置文件"配置名称命令行,可执行文件的具体语句 C:\Program Files\Git\bin\bash.exe启动目录…...
C语言实现选择排序
什么是选择排序? 选择排序是一种简单直观的排序算法,它的核心思想是每次从未排序的元素中选择最小(或最大)的元素,然后将其放到已排序序列的末尾。通过重复这个过程,直到所有元素都排好序为止。 选择排序…...
unable to write symref for HEAD: Permission denied
今天从gitee上面克隆项目到本地时报错如下 warning: unable to unlink ‘D:/IDEAcode/ruiji1.0/.git/HEAD.lock’: Invalid argument error: unable to write symref for HEAD: Permission denied 解决方法:将要存放项目的文件夹权限修改为完全控制 原先权限&…...
长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的实践技术应用
植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…...
【行为型设计模式】C#设计模式之策略模式
题目:假设你正在开发一个手机应用程序,该应用程序包含一个计算器功能。用户可以根据自己的需求选择不同的计算策略进行计算,例如加法、减法、乘法或除法。请使用策略模式设计该计算器功能,使得用户可以根据自己的选择进行相应的计…...
Linux Shell 编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天…...
Webstorm + Egg.js 进行断点调试
Webstorm Egg.js 进行断点调试 1、在工具栏找到编辑配置,创建已运行Node.js 应用程序的调试配置 2、debug调试配置 3、调试 4、查看断点是否起效...
Oracle-创建PDB
Oracle-创建PDB 创建PDB的方式 从PDB$SEED新建PDB克隆已存在的PDB 本地PDB克隆到同一个CDB中将远程PDB克隆到CDB中将非CDB插入或克隆到CDB中通过插拔的方式创建PDB sql 命令语法 条件 CDB必须open并且read write模式连接CDB$ROOT 用户并且具有CREATEPLUGGABLEDATABASE系统权…...
5分钟掌握SketchUp STL插件:从3D建模到3D打印的完整转换指南
5分钟掌握SketchUp STL插件:从3D建模到3D打印的完整转换指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是…...
一个免费、轻量的 Typora 图床方案:Cloudflare R2 + Python——十分钟完成
一个免费、轻量的 Typora 图床方案:Cloudflare R2 Python,十分钟搞定 平时我主要用 Typora 写 Markdown,一直想要一个尽量简单的图床方案: 粘贴图片后自动上传,自动回填链接,不想额外折腾一堆服务和配置。…...
插件开发——upgrade 插件版本升级
upgrade 插件版本升级插件在更新迭代版本时,可能需要进行业务升级每个版本数据库变更文件存放位置文件位置:niucloud-addon/插件名称/src/main/resources/插件名称/upgrade/一键升级在 admin 端进行在线升级,升级的时候会执行 sql 文件...
SAMD微控制器安全Flash存储库设计与实践
1. 项目概述SAMD_SafeFlashStorage 是一款专为 SAMD21(如 Arduino Zero、MKR系列)和 SAMD51(如 Adafruit Metro M4、Arduino MKR VIDOR 4000)微控制器设计的安全型闪存数据存储库。它并非简单复刻,而是对原始 cmaglie/…...
网盘下载限速终结者:8大平台直链解析终极指南
网盘下载限速终结者:8大平台直链解析终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅…...
Qwen3.5-4B-Claude-Opus详细步骤:修改系统提示词打造专属AI助教方法
Qwen3.5-4B-Claude-Opus详细步骤:修改系统提示词打造专属AI助教方法 1. 理解模型特性 1.1 模型基础介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答、代码与逻辑类问…...
2026届毕业生推荐的十大AI学术网站横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI论文查重系统依靠深度学习跟自然语言处理技术,能够针对论文文本开展语义级相似…...
最新版微信证件照小程序源码 前后端开源 带后台附教程
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新版微信证件照小程序源码 前后端开源 带后台附教程 无需单独购买API 本地0成本处理 无限免费调用API 不保存用户图片,仅保存生成后的最新一张 支持水印 支持流量主 支持自由开关鉴黄…...
手把手教你用MySQL搭建苍穹外卖数据库(附完整sky.sql源码)
从零构建外卖系统数据库:MySQL实战与设计精要 第一次接触数据库设计时,我盯着电脑屏幕发呆了整整半小时——那些看似简单的用户地址、菜品分类和订单状态,到底该如何用数据表合理表达?如果你也曾在数据库建模时感到无从下手&#…...
Avian Physics vs 其他物理引擎:为什么选择基于XPBD的解决方案 [特殊字符]
Avian Physics vs 其他物理引擎:为什么选择基于XPBD的解决方案 🚀 【免费下载链接】avian ECS-driven 2D and 3D physics engine for the Bevy game engine. 项目地址: https://gitcode.com/gh_mirrors/be/avian 在游戏开发的世界中,物…...
