当前位置: 首页 > news >正文

通道注意力机制

知识点:

通道注意力机制 Channel Attention Model CAM;

自适应池化层(Adaptive Pooling Layer);

全局平均池化(Global Average Pooling );

全局最大池化(Global Max Pooling);

nn.linear 全连接层操作;


参考博客: 通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM)-CSDN博客

容易忽略的认知!!

不管是通道注意力机制还是空间注意力机制,他都是为了得到一个权重 然后和 原来特征图相乘。 


自适应池化层

nn.AdaptiveAvgPool2d(1) nn.AdaptiveMaxPool2d(1) 都是 自适应池化层(Adaptive Pooling Layer),它们分别实现了 自适应平均池化自适应最大池化

这两种池化方法的目标是将输入的特征图(tensor)调整为指定的输出大小(在这里是 1x1)。不过它们使用不同的池化方法:平均池化和最大池化。

平均池化和最大池化分别适用于什么场景呢?_平均池化和最大池化的特点和区别-CSDN博客

平均池化

使用场景:常用于 特征汇聚,如 全局特征提取,可以将图像的所有空间信息汇聚成一个标量。广泛用于分类任务中,通常在 CNN 的最后加一个全连接层前使用。

import torch
import torch.nn as nn# 创建测试数据
x = torch.randn(2, 3, 32, 32)  # [批次, 通道数, 高度, 宽度]# 不同输出尺寸的池化层
pool1 = nn.AdaptiveAvgPool2d(1)
pool2 = nn.AdaptiveAvgPool2d((4, 4))
pool3 = nn.AdaptiveAvgPool2d((3, 5))# 查看输出形状
out1 = pool1(x)
out2 = pool2(x)
out3 = pool3(x)print(f"输入形状: {x.shape}")
print(f"输出形状1: {out1.shape}")  # [2, 3, 1, 1]
print(f"输出形状2: {out2.shape}")  # [2, 3, 4, 4]
print(f"输出形状3: {out3.shape}")  # [2, 3, 3, 5]

最大池化 

常用于提取 最强的特征,例如在物体检测任务中可能希望选取最显著的特征。最大池化操作有时能够帮助模型捕捉到图像中的关键细节。


 通道注意力机制代码

import torch
import torch.nn as nn
import torch.nn.functional as Fclass ChannelAttention(nn.Module):def __init__(self, in_channels, reduction_ratio=16):"""初始化通道注意力模块Args:in_channels (int): 输入特征图的通道数reduction_ratio (int): 降维比例,用于减少参数量"""super().__init__()# 确保降维后的通道数至少为1self.reduced_channels = max(in_channels // reduction_ratio, 1)# 全局平均池化 和 最大池化self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)#  Sigmoid激活函数self.sigmoid = nn.Sigmoid()# 共享MLP网络# W0: in_channels -> reduced_channels# w1: reduced_channels -> in_channelsself.mlp = nn.Sequential(nn.Linear(in_channels,self.reduced_channels),nn.ReLU(inplace=True),  # inplace=True 节省内存,直接在输入张量上修改,不会新建内存空间。默认是Falsenn.Linear(self.reduced_channels,in_channels))def forward(self, x):"""前向传播Args:x (torch.Tensor): 输入特征图 [B, C, H, W]Returns:torch.Tensor: 经过通道注意力加权后的特征图"""b,c,h,w = x.size()avg_pool = self.avg_pool(x).view(b, c)  # [b,c,1,1]--> [b,c]max_pool = self.max_pool(x).view(b, c)avg_out=self.mlp(avg_pool) # w1(w0(F_avg^c))max_out=self.mlp(max_pool)# 融合两个分支并进行sigmoid激活channel_attention = self.sigmoid(max_out + avg_out)# 重塑维度用于乘法运算channel_attention = channel_attention.view(b, c, 1, 1)# 将注意力权重应用于乘法运算return x*channel_attentionif __name__ == '__main__':# 创建测试数据batch_size = 2channels =  3height = 64width = 64x=torch.randn(batch_size, channels, height, width)cam = ChannelAttention(in_channels=channels, reduction_ratio=16)outputs = cam(x)print(f"Input shape:{x.shape}")print(f"Output shape:{outputs.shape}")

(1)深度学习基础知识(八股)——常用名词解释_深度学习八股-CSDN博客

nn.Linear()只对最后一维进行操作

相关文章:

  • spring jms使用
  • 上位机开发:C# 读写 PLC 数据块数据
  • 内存分配函数malloc kmalloc vmalloc
  • LeetCode 3442.奇偶频次间的最大差值 I:计数
  • gro文件和top文件介绍,以及如何合并两个gro文件或两个top文件
  • 天猫官方认证TP服务商——品融电商代运营全链路解析
  • WHAT - 组件库单入口打包和多入口打包
  • 基于FPGA的PID算法学习———实现PID比例控制算法
  • 大型活动交通拥堵治理的视觉算法应用
  • 如何保证RocketMQ消息不丢失
  • 《广度优先搜索》题集
  • 钉钉告警集成部署指南
  • ROS move base 简易调试
  • 在postgresql中,group by时取第一个值
  • AIGC 基础篇 Python基础 04 for循环与while循环
  • 华为仓颉语言初识:并发编程之同步机制(下)
  • 华为0528笔试
  • 基于流形迁移学习的快速动态多目标进化算法(MMTL-MOEA/D)求解FDA1-FDA5和dMOP1-dMOP3,提供完整MATLAB代码
  • C++中的跳转语句
  • 大模型中Function Call的定义与核心功能
  • 个人网站如何建/谷歌搜索引擎入口google
  • 山东省住房和城乡建设部网站/互联网推广销售
  • 长春电商网站建设哪家专业/山东疫情最新情况
  • 做团购网站/网上销售培训课程
  • 昆明网站做的好的公司简介/互联网营销师培训机构哪家好
  • 苏州网站开发公司兴田德润在哪儿/上海十大营销策划公司