CBAM注意力机制——pytorch实现

论文传送门:CBAM: Convolutional Block Attention Module

CBAM的目的:

为网络添加注意力机制

CBAM的结构:

通道注意力机制(Channel attention module):输入特征分别经过全局最大池化和全局平均池化,池化结果经过一个权值共享的MLP,得到的权重相加,最后经过sigmoid激活函数得到通道注意力权重 M c M_c Mc
空间注意力机制(Spatial attention module):输入特征在通道维度上分别进行最大池化和平均池化,得到(2,H,W)的特征层,经过7x7的卷积,输出单通道特征层,最后经过sigmoid激活函数得到空间注意力权重 M s M_s Ms
通道注意力机制和空间注意力机制
二者串联:作者将二者串联搭建,且通道注意力模块在前,空间注意力模块在后。
CBAM结构
经过实验,作者发现:串联搭建比并联搭建效果好,先进行通道注意力比先空间注意力效果好。
结构的原因

import torch
import torch.nn as nn


class ChannelAttention(nn.Module):  # Channel attention module
    def __init__(self, channels, ratio=16):  # r: reduction ratio=16
        super(ChannelAttention, self).__init__()

        hidden_channels = channels // ratio
        self.avgpool = nn.AdaptiveAvgPool2d(1)  # global avg pool
        self.maxpool = nn.AdaptiveMaxPool2d(1)  # global max pool
        self.mlp = nn.Sequential(
            nn.Conv2d(channels, hidden_channels, 1, 1, 0, bias=False),  # 1x1conv代替全连接,根据原文公式没有偏置项
            nn.ReLU(inplace=True),  # relu
            nn.Conv2d(hidden_channels, channels, 1, 1, 0, bias=False)  # 1x1conv代替全连接,根据原文公式没有偏置项
        )
        self.sigmoid = nn.Sigmoid()  # sigmoid

    def forward(self, x):
        x_avg = self.avgpool(x)
        x_max = self.maxpool(x)
        return self.sigmoid(
            self.mlp(x_avg) + self.mlp(x_max)
        )  # Mc(F) = σ(MLP(AvgPool(F))+MLP(MaxPool(F)))= σ(W1(W0(Fcavg))+W1(W0(Fcmax))),对应原文公式(2)


class SpatialAttention(nn.Module):  # Spatial attention module
    def __init__(self):
        super(SpatialAttention, self).__init__()

        self.conv = nn.Conv2d(2, 1, 7, 1, 3, bias=False)  # 7x7conv
        self.sigmoid = nn.Sigmoid()  # sigmoid

    def forward(self, x):
        x_avg = torch.mean(x, dim=1, keepdim=True)  # 在通道维度上进行avgpool,(B,C,H,W)->(B,1,H,W)
        x_max = torch.max(x, dim=1, keepdim=True)[0]  # 在通道维度上进行maxpool,(B,C,H,W)->(B,1,H,W)
        return self.sigmoid(
            self.conv(torch.cat([x_avg, x_max],dim=1))
        )  # Ms(F) = σ(f7×7([AvgP ool(F);MaxPool(F)])) = σ(f7×7([Fsavg;Fsmax])),对应原文公式(3)


class CBAM(nn.Module):  # Convolutional Block Attention Module
    def __init__(self, channels, ratio=16):
        super(CBAM, self).__init__()

        self.channel_attention = ChannelAttention(channels, ratio)  # Channel attention module
        self.spatial_attention = SpatialAttention()  # Spatial attention module

    def forward(self, x):
        f1 = self.channel_attention(x) * x  # F0 = Mc(F)⊗F,对应原文公式(1)
        f2 = self.spatial_attention(f1) * f1  # F00 = Ms(F0)⊗F0,对应原文公式(1)
        return f2
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CBAM(Convolutional Block Attention Module)是一种针对卷积神经网络(CNN)的注意力机制,在PyTorch中可以使用以下代码实现: ```python import torch import torch.nn as nn import torch.nn.functional as F class CBAM_Module(nn.Module): def __init__(self, channels, reduction=16): super(CBAM_Module, self).__init__() self.max_pool = nn.AdaptiveMaxPool2d(1) self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc1 = nn.Linear(channels, channels // reduction, bias=False) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Linear(channels // reduction, channels, bias=False) self.sigmoid_channel = nn.Sigmoid() self.sigmoid_spatial = nn.Sigmoid() self.conv = nn.Conv2d(2, 1, kernel_size=7, stride=1, padding=3) def forward(self, x): max_out = self.max_pool(x) avg_out = self.avg_pool(x) max_out = max_out.view(max_out.size(0), -1) avg_out = avg_out.view(avg_out.size(0), -1) out = torch.cat((max_out, avg_out), dim=1) out = self.fc1(out) out = self.relu(out) out = self.fc2(out) channel_attention = self.sigmoid_channel(out) channel_attention = channel_attention.view(channel_attention.size(0), channel_attention.size(1), 1, 1) x = x * channel_attention spatial_attention = torch.mean(x, dim=1, keepdim=True) spatial_attention = self.conv(spatial_attention) spatial_attention = self.sigmoid_spatial(spatial_attention) x = x * spatial_attention return x ``` 这个模块包含两个部分:通道注意力和空间注意力。通道注意力用来对每个通道的特征进行加权,从而强化重要的特征,减弱不重要的特征。空间注意力则用来对特征图中的每个位置进行加权,以便在不同的位置上聚焦于重要的特征。 通过在CNN中使用CBAM模块,可以提高模型的性能和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV_Peach

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值