首页 > 其他分享 >【深度学习】CAB:通道注意力模块

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

时间:2025-01-11 19:28:45浏览次数:3  
标签:nn 特征 self reduction 模块 CAB 注意力 channel 通道

@[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 F

class ChannelAttentionBlock(nn.Module):
    def __init__(self, channel, reduction_ratio=16):
        """
        初始化 CAB 模块
        :param channel: 输入特征图的通道数
        :param reduction_ratio: 降维比例,默认为 16
        """
        super(ChannelAttentionBlock, self).__init__()
        self.channel = channel
        self.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 --> point
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # feature channel downscale and upscale --> channel weight
        self.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 是一种简单但有效的通道注意力模块,通过学习通道之间的依赖关系,能够自适应地增强重要特征并抑制不重要特征。

标签:nn,特征,self,reduction,模块,CAB,注意力,channel,通道
From: https://blog.csdn.net/weixin_59422604/article/details/145081004

相关文章

  • 【深度学习】SAB:空间注意力
    @[toc]SAB:空间注意力SAB:空间注意力SA(SpatialAttention)空间注意力模块是一种用于计算机视觉任务的注意力机制,它的核心思想是通过学习特征图在空间维度上的重要性,自适应地增强或抑制不同空间位置的特征响应。与通道注意力(如SENet或CBAM中的通道注意力模块)不同,空间注意......
  • enum模块(枚举类型)
    enum模块:pythonenum模块提供了枚举功能。有些编程语言是内置了枚举类型,但python没有内置,只是用enum模块里的Enum类来实现类似功能。如果不使用枚举,我们一般会采用定义常量的方式来处理。比如下面代码:RED,GREEN,YELLOW=range(3)下面演示了一个常见的enum类的创建:fromenu......
  • 手戳usb转串口芯片cp2102模块——理论知识
    一、简介 CP2102是一个USB转串行通信接口的芯片,常用于将USB接口转换为常见的串口接口(RS-232、TTL等)。它通常用于嵌入式系统、数据传输以及外设控制等领域。以下内容基于电脑通过cp2102与esp32进行串口通信(比如烧录程序、数据发送与接受)的情景讲述。二、讲述以上......
  • npm如何对模块进行安装与卸载?
    在前端开发中,npm(NodePackageManager)是一个非常重要的工具,它允许开发者安装、卸载和管理Node.js模块。以下是关于如何使用npm进行模块的安装与卸载的详细步骤:安装模块本地安装:打开命令行工具(如Terminal、CommandPrompt或PowerShell)。导航到项目目录。运行npminstall<......
  • npm如何对模块进行升级和安装?
    在前端开发中,npm(NodePackageManager)是一个非常重要的工具,用于安装、升级和管理JavaScript库和模块。以下是关于如何使用npm进行模块升级和安装的详细步骤:安装模块初始化项目:在开始安装模块之前,通常需要先初始化一个项目。这可以通过运行npminit命令来完成,该命令会引导你填......
  • YOLOv11改进,YOLOv11添加HAttention注意机制用于图像修复的混合注意力转换器,CVPR2023,超
    摘要基于Transformer的方法在低层视觉任务中表现出色,例如图像超分辨率。然而,作者通过归因分析发现,这些网络只能利用有限的空间范围的输入信息。这意味着现有网络尚未充分发挥Transformer的潜力。为了激活更多的输入像素以获得更好的重建效果,作者提出了一种新型的混合注......
  • 创建maven多模块项目
    创建Maven父模块创建项目项目目录结构、pom.xml文件在pom.xml文件中配置打包类型为pom创建子模块common选中项目,鼠标右键,依次选择“New→Module”项目pom.xml文件,可以看到parent标签里的内容,表示父模块的信息。在pom.xml文件中配置打包类型为jar(非必须,可......
  • YOLOv11改进策略【独家融合改进】| AFPN渐进式自适应特征金字塔 + 注意力机制,适用专栏
    一、本文介绍本文利用AFPN和注意力模块对YOLOv11的网络模型进行优化提升。本文以SimAM注意力模块为例,目的是让网络能够学习到更深层的语义信息,并结合AFPN的渐近式融合及自适应空间融合操作,逐步整合不同层级特征,有效避免非相邻层级间因语义差距过大导致的信息丢失或降级......
  • 使用chai3d-GEL模块进行软体模型力反馈仿真的一点碎片化记录
    在要模拟的网格模型中手动添加节点或者对于形状比较复杂的模型使用TetGen之类的网格划分程序自动添加节点和连接;然后设置合理的仿真参数(质量、刚度、重力、时间步长...)骨架驱动:SkeletonModel 使用骨架结构来表示变形体。骨架由一系列节点(cGELSkeletonNode)和连接这些节点的弹簧(c......
  • YOLOv11改进,YOLOv11自研检测头融合HyCTAS的Self_Attention自注意力机制(2024),并添加小目
    摘要论文提出了一种新的搜索框架,名为HyCTAS,用于在给定任务中自动搜索高效的神经网络架构。HyCTAS框架结合了高分辨率表示和自注意力机制,通过多目标优化搜索,找到了一种在性能和计算效率之间的平衡。#理论介绍自注意力(Self-Attention)机制是HyCTAS框架中的一个重要组......