问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

CBAM:一种增强卷积神经网络性能的双重注意力机制

创作时间:
作者:
@小白创作中心

CBAM:一种增强卷积神经网络性能的双重注意力机制

引用
CSDN
1.
https://blog.csdn.net/xiaoh_7/article/details/137360865

CBAM(Convolutional Block Attention Module)是一种增强卷积神经网络性能的注意力模块,通过结合通道注意力和空间注意力,为模型提供了更加全面和有效的特征提取能力。本文将详细介绍CBAM的工作原理、独特优势以及在实际应用中的代码实现。

CBAM工作原理

CBAM模块的核心思想是对输入特征图进行两阶段的精炼:首先通过通道注意力模块关注于“哪些通道是重要的”,然后通过空间注意力模块关注于“在哪里”是一个有信息的部分。这种双重注意力机制使CBAM能够全面捕获特征中的关键信息。

1. 通道注意力模块

通道注意力模块的输出M c ( F ) M_c(F)Mc (F)可以通过以下公式计算:

M c ( F ) = σ ( M L P ( A v g P o o l ( F ) ) + M L P ( M a x P o o l ( F ) ) ) M_c(F) = \sigma(MLP(AvgPool(F)) + MLP(MaxPool(F)))Mc (F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F)))

其中,F FF是输入特征图,A v g P o o l AvgPoolAvgPool和M a x P o o l MaxPoolMaxPool分别表示全局平均池化和最大池化操作,M L P MLPMLP表示多层感知机,σ \sigmaσ表示 Sigmoid 激活函数。

2. 空间注意力模块

空间注意力模块的输出M s ( F ) M_s(F)Ms (F)可以通过以下公式计算:

M s ( F ) = σ ( f 7 × 7 ( [ A v g P o o l ( F ) ; M a x P o o l ( F ) ] ) ) M_s(F) = \sigma(f^{7 \times 7}([AvgPool(F); MaxPool(F)]))Ms (F)=σ(f7×7([AvgPool(F);MaxPool(F)]))

其中,f 7 × 7 f^{7 \times 7}f7×7表示一个7 × 7 7 \times 77×7的卷积操作,[ A v g P o o l ( F ) ; M a x P o o l ( F ) ] [AvgPool(F); MaxPool(F)][AvgPool(F);MaxPool(F)]表示将平均池化和最大池化结果沿通道轴拼接起来。

CBAM独特优势

  1. 双重注意力机制

CBAM通过结合通道注意力和空间注意力,实现了对输入特征的双重精炼。这种设计使模型能够同时关注哪些通道和哪些空间位置是有意义的,从而提高了模型的表征能力和决策准确性。

  1. 自适应特征重标定

CBAM能够根据任务需求和内容上下文动态地调整特征图中每个通道和空间位置的重要性。这种自适应重标定机制有助于模型更好地关注于关键特征,提高识别性能。

  1. 灵活性和通用性

CBAM模块设计简洁,易于集成到各种现有的CNN架构中。这使得CBAM成为一种通用的插件,可以广泛应用于图像分类、目标检测、语义分割等多种视觉识别任务。

  1. 计算效率高

尽管CBAM为模型引入了额外的计算量,但其设计考虑了计算效率。通过全局池化和简单的卷积操作,CBAM能够在保持较低额外计算成本的同时带来性能提升。

CBAM代码实现

下面是一个简单的PyTorch代码示例,展示了如何将CBAM模块集成到卷积神经网络中:

import torch
from torch import nn

# 通道注意力模块
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.relu1 = nn.ReLU()  # ReLU激活函数
        self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)  # 第二个卷积层,升维
        self.sigmoid = nn.Sigmoid()  # Sigmoid函数生成最终的注意力权重

    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))  # 对平均池化的特征进行处理
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))  # 对最大池化的特征进行处理
        out = avg_out + max_out  # 将两种池化的特征加权和作为输出
        return self.sigmoid(out)  # 使用sigmoid激活函数计算注意力权重

# 空间注意力模块
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'  # 核心大小只能是3或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()  # 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)  # 将两种池化的特征图连接起来
        x = self.conv1(x)  # 通过卷积层处理连接后的特征图
        return self.sigmoid(x)  # 使用sigmoid激活函数计算注意力权重

# CBAM模块
class CBAM(nn.Module):
    def __init__(self, in_planes, ratio=16, kernel_size=7):
        super(CBAM, self).__init__()
        self.ca = ChannelAttention(in_planes, ratio)  # 通道注意力实例
        self.sa = SpatialAttention(kernel_size)  # 空间注意力实例

    def forward(self, x):
        out = x * self.ca(x)  # 使用通道注意力加权输入特征图
        result = out * self.sa(out)  # 使用空间注意力进一步加权特征图
        return result  # 返回最终的特征图

# 示例使用
if __name__ == '__main__':
    block = CBAM(64)  # 创建一个CBAM模块,输入通道为64
    input = torch.rand(4, 256, 64, 64)  # 随机生成一个输入特征图
    output = block(input)  # 通过CBAM模块处理输入特征图
    print(input.size(), output.size())  # 打印输入和输出的shape进行验证

总结

CBAM是一种强大的注意力模块,通过结合通道注意力和空间注意力,为卷积神经网络提供了更加全面和有效的特征提取能力。这种双重注意力机制使得模型能够自适应地关注于输入特征中的关键通道和空间位置,从而提高了模型的性能。CBAM模块设计简洁、灵活,易于集成到各种现有的CNN架构中,并广泛应用于多种视觉识别任务。通过引入额外的计算量,CBAM能够在保持较低额外计算成本的同时带来显著的性能提升。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号