CBAM注意力机制原理详解及源码解析
创作时间:
作者:
@小白创作中心
CBAM注意力机制原理详解及源码解析
引用
CSDN
1.
https://m.blog.csdn.net/qq_47233366/article/details/137103025
CBAM(Convolutional Block Attention Module)是一种常见的注意力机制,广泛应用于深度学习和计算机视觉领域。本文将详细介绍CBAM的原理和源码实现,帮助读者深入理解这一技术。
CBAM原理详解
CBAM的整体结构如下图所示:
首先,输入特征图(Input Feature)会分别送入Channel Attention Module(通道注意力模块)和Spatial Attention Module(空间注意力模块)。这两个模块会分别生成通道注意力权重和空间注意力权重,最终得到精制特征图(Refined Feature)。
Channel Attention Module
通道注意力模块的结构如下:
具体步骤如下:
- 对输入特征图F进行全局最大池化和全局平均池化,得到两个1 × 1 × C的特征图
- 将这两个特征图送入两个全连接层(MLP)
- 将两个特征图相加并经过sigmoid激活函数,得到通道注意力权重M_c
Spatial Attention Module
空间注意力模块的结构如下:
具体步骤如下:
- 对通道注意力模块的输出特征图F'进行全局最大池化和全局平均池化,得到两个H × W × 1的特征图
- 将这两个特征图在channel维度拼接,得到H × W × 2的特征图
- 进行一次卷积操作,将特征图大小变为H × W × 1
- 经过sigmoid激活函数,得到空间注意力权重M_s
CBAM代码详解
下面是CBAM的完整代码实现:
import torch
import torch.nn as nn
import torch.nn.functional as F
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
self.relu = nn.ReLU()
self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x))))
max_out = self.fc2(self.relu(self.fc1(self.max_pool(x))))
out = self.sigmoid(avg_out + max_out)
return out
class SpatialAttention(nn.Module):
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 1
self.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)
x = torch.cat([avg_out, max_out], dim=1)
out = self.sigmoid(self.conv1(x))
return out
class CBAM(nn.Module):
def __init__(self, in_planes, ratio=1, kernel_size=7):
super(CBAM, self).__init__()
self.channel_att = ChannelAttention(in_planes, ratio)
self.spatial_att = SpatialAttention(kernel_size)
def forward(self, x):
out = self.channel_att(x) * x
print(self.channel_att(x).shape)
print(f"channel Attention Module:{out.shape}")
out = self.spatial_att(out) * out
print(self.spatial_att(out).shape)
#print(f"Spatial Attention Module:{out.shape}")
return out
if __name__ == '__main__':
# Testing
model = CBAM(3)
input_tensor = torch.ones((1, 3, 224, 224))
output_tensor = model(input_tensor)
print(f'Input shape: {input_tensor.shape})')
print(f'Output shape: {output_tensor.shape}')
运行结果如下:
第一行表示理论部分的特征图M_c,第二行表示F',第三行表示特征图M_s,第四行表示输入,第五行表示CBAM的最终输出。
热门推荐
生活中的健康小贴士:从骨折康复到美甲护理
水溶肥有什么作用和优点和缺点?
化肥的主要分类,不同化肥的用途是什么?
肺不张的病因、诊断与治疗丨临床必备
用课程建设激活人工智能教育
我和我母亲都是类风湿关节炎患者,我的孩子会是吗?
武昌起义:中国近现代史上的重要节点和革命激情的点燃
武昌起义:中国近现代史上的重要节点和革命激情的点燃
刑事案件如何请律师辩护
14岁自愿的法律年龄问题与刑事责任认定
如何选择合适的基金进行投资
高硼硅玻璃是食品级的吗?使用指南与选购要点
汕头出台新方案!中小学生每天综合体育活动时间不低于2小时
每天2小时体育活动如何保证?
王者荣耀是用什么编程语言开发的
外贸信用证操作中的问题及方案
十类学生必备户外用品有哪些 学生户外运动需要哪些装备
国家能源局:光伏内卷式竞争仍未根本解决 正在配合有关部门研究完善政策措施
游客被袋鼠打伤!上海野生动物园:严格筛选“营业”袋鼠,也别惹火烈鸟
绩效管理循环的中央,如何确保各部门协同?
控股股东集中竞价减持股份的法律规制及其合规路径探析
为何都说日系车开不坏,而德系、美系车却被贴上“娇贵”的标签?
汽车能开多少年?影响汽车寿命的关键因素解析
探索若尔盖的住宿之美:在草原的怀抱中安然入眠
妙绘艺学:赛璐璐的上色方法
赛璐璐画风插画教程:从入门到精通的六步指南
在简历上可以写哪些数据分析项目
简历中有瑕疵部分,在面试中该如何巧妙解释符合面试技巧
放松解压、社交互动、沉浸式体验……87.1%受访青年身边有年轻人聚集的夜市街区
解锁射频技术:多种 S 参数的特性、应用及关键解析