注意力机制——CBAM原理详解及源码解析
创作时间:
作者:
@小白创作中心
注意力机制——CBAM原理详解及源码解析
引用
CSDN
1.
https://m.blog.csdn.net/qq_47233366/article/details/137103025
CBAM(Convolutional Block Attention Module)是一种常见的注意力机制,通过通道注意力模块和空间注意力模块来增强特征表示。本文将详细介绍CBAM的原理,并提供完整的PyTorch实现代码。
CBAM原理详解
CBAM的整体结构如下图所示:
首先,输入特征图会分别送入通道注意力模块和空间注意力模块,最终得到精制的特征图。
Channel Attention Module
通道注意力模块的结构如下:
具体步骤如下:
- 对输入特征图F进行全局最大池化和全局平均池化,得到两个1×1×C的特征图。
- 将这两个特征图送入两个全连接层(MLP)中,输出两个1×1×C的特征图。
- 将两个特征图相加并经过sigmoid激活函数,得到通道注意力M_c,其尺寸为1×1×C。
Spatial Attention Module
空间注意力模块的结构如下:
具体步骤如下:
- 对通道注意力模块的输出特征图F'进行全局最大池化和全局平均池化,得到两个H×W×1的特征图。
- 将两个特征图在channel维度拼接,得到H×W×2的特征图。
- 进行一次卷积操作,将特征图尺寸变为H×W×1。
- 经过sigmoid激活函数,得到空间注意力M_s,其尺寸为H×W×1。
CBAM代码详解
下面是CBAM的完整PyTorch实现代码:
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的最终输出。
小结
本文详细介绍了CBAM的原理和实现,包括通道注意力模块和空间注意力模块。通过本文,读者可以深入了解CBAM的工作原理,并掌握其在PyTorch中的实现方法。
热门推荐
耳朵里有异响,但不是耳鸣
十类送摄影爱好者最佳的礼物推荐 给喜欢摄影的朋友买什么礼物
感冒精神恍惚?医生告诉你如何找回清晰世界
吉他拨片要怎么选择厚度?看完你就知道了
18K黄金发黑怎么办?原因分析与清洁保养全攻略
肾囊肿的治疗方法全解析
电脑下载软件默认c盘怎么改到d盘 6种方法教会你
《菜根谭》:中国人的处世智慧,全在这8句话里了
全案设计师如何规划餐边柜收纳分区?
哭过以后头疼怎么办
大问题!读四年美高申请大学算本地生吗?
温和祛痘为肌肤保驾护航!
AI生成照片是作品吗:探讨其创作过程与认定标准
机器学习的四大学派:符号主义学派、贝叶斯学派、连接主义学派与进化仿生学派
“川剧变脸”津门竞技 师生联袂传承技艺
亥时是几点到几点
国内申请国际学校留学,流程是怎样的?如何顺利入学?
黄金首饰在家怎么清洗才亮?多种实用清洁保养方法
交通事故赔偿义务人的相关法律
珠海斗门白蕉镇:历经二十余载发展成国内最大猛犸牙雕基地
换个角度看春天!透过航拍镜头走进五彩斑斓的中国
刚需向左,改善向右,中间预算客户奔向次新房?
《易经》中的"益卦"详解:从卦象到运势的全面解读
多地推出“求职实习免费住”,满足这些条件可申请→
水温高发动机故障灯亮的原因及解决方法
2024年公务员报考热度不减,各省报考比例与人数分析
@宝爸宝妈们,换牙期健康手册,收藏不谢!
泡药用的黄酒:传统中药的重要辅助材料
此人名气不大胆子不小,一首剑气凌然之作,无一剑字却句句不离剑
脊柱骨折术后出现脚部血液循环不畅如何处理