欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 【深度学习】CAB:通道注意力模块

【深度学习】CAB:通道注意力模块

2025/5/14 12:08:17 来源:https://blog.csdn.net/weixin_59422604/article/details/145081004  浏览:    关键词:【深度学习】CAB:通道注意力模块

@[toc]CAB:通道注意力模块

CAB:通道注意力模块

CAB(Channel Attention Block) 是一种通道注意力模块,通常用于计算机视觉任务中,特别是在图像恢复、超分辨率、去噪等任务中。它的核心思想是通过学习通道之间的依赖关系,自适应地调整每个通道的特征响应,从而增强模型对重要特征的提取能力。

CAB 的核心思想

通道注意力机制:

通过对每个通道的特征进行全局池化,获取全局信息。

使用全连接层(或 1x1 卷积)学习通道之间的依赖关系。

通过 Sigmoid 函数生成通道注意力权重,对原始特征进行加权。

残差连接:

为了保留原始特征信息,通常会在通道注意力模块的输出上添加残差连接。

CAB 的结构

全局平均池化(Global Average Pooling, GAP):

对输入特征图的每个通道进行全局平均池化,得到一个通道描述向量。

全连接层(或 1x1 卷积):

使用全连接层(或 1x1 卷积)学习通道之间的关系。

通常包含一个降维层和一个升维层,以减少计算量。

Sigmoid 激活函数:

对学习到的通道关系进行归一化,生成通道注意力权重。

特征加权:

将生成的通道注意力权重与输入特征图相乘,得到加权后的特征。

残差连接:

将加权后的特征与输入特征相加,保留原始信息。

代码实现

1.使用线性层:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass ChannelAttentionBlock(nn.Module):def __init__(self, channel, reduction_ratio=16):"""初始化 CAB 模块:param channel: 输入特征图的通道数:param reduction_ratio: 降维比例,默认为 16"""super(ChannelAttentionBlock, self).__init__()self.channel = channelself.reduction_ratio = reduction_ratio# 全局平均池化self.gap = nn.AdaptiveAvgPool2d(1)# 全连接层(或 1x1 卷积)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction_ratio, bias=False),  # 降维nn.ReLU(inplace=True),nn.Linear(channel // reduction_ratio, channel, bias=False),  # 升维nn.Sigmoid()  # 归一化)def forward(self, x):"""前向传播:param x: 输入特征图,形状为 [batch_size, channel, height, width]:return: 加权后的特征图"""b, c, h, w = x.size()# 全局平均池化y = self.gap(x).view(b, c)  # [batch_size, channel]# 全连接层y = self.fc(y).view(b, c, 1, 1)  # [batch_size, channel, 1, 1]# 特征加权out = x * y.expand_as(x)  # [batch_size, channel, height, width]# 残差连接return out + x

2.使用卷积层

class CALayer(nn.Module):def __init__(self, channel, reduction=16, bias=False):super(CALayer, self).__init__()# global average pooling: feature --> pointself.avg_pool = nn.AdaptiveAvgPool2d(1)# feature channel downscale and upscale --> channel weightself.conv_du = nn.Sequential(nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=bias),nn.ReLU(inplace=True),nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=bias),nn.Sigmoid())def forward(self, x):y = self.avg_pool(x)y = self.conv_du(y)return x * y

卷积与线性层对比

在这里插入图片描述

总结

CAB 是一种简单但有效的通道注意力模块,通过学习通道之间的依赖关系,能够自适应地增强重要特征并抑制不重要特征。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词