news 2026/4/16 16:11:03

day49_通道注意力机制 @浙大疏锦行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day49_通道注意力机制 @浙大疏锦行

Day 49通道注意力机制 @浙大疏锦行

概念

  • 目的:让神经网络自动学习每个特征通道的重要性,从而增强有用的特征通道,抑制无用的特征通道。
  • 实现步骤
    1. Squeeze (压缩)
      • 使用全局平均池化 (nn.AdaptiveAvgPool2d(1))。
      • 将形状为( B , C , H , W ) (B, C, H, W)(B,C,H,W)的特征图压缩为( B , C , 1 , 1 ) (B, C, 1, 1)(B,C,1,1),使每个通道获得全局感受野。
    2. Excitation (激励)
      • 使用两个全连接层(FC)组成的“瓶颈”结构。
      • 第一个 FC 将通道数降低(reduction_ratio=16),减少计算量并引入非线性。
      • 第二个 FC 将通道数恢复。
      • 最后通过Sigmoid激活函数,输出每个通道的权重(范围 0~1)。
    3. Scale (重标定)
      • 将生成的通道权重与原始特征图相乘 (x * y),完成特征重标定。

代码

模型对比

# 基础CNN模型classCNN(nn.Module):def__init__(self):super(CNN,self).__init__()self.conv1=nn.Conv2d(3,32,3,padding=1)self.bn1=nn.BatchNorm2d(32)self.relu1=nn.ReLU()self.pool1=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(32,64,3,padding=1)self.bn2=nn.BatchNorm2d(64)self.relu2=nn.ReLU()self.pool2=nn.MaxPool2d(2)self.conv3=nn.Conv2d(64,128,3,padding=1)self.bn3=nn.BatchNorm2d(128)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(2)self.fc1=nn.Linear(128*4*4,512)self.dropout=nn.Dropout(p=0.5)self.fc2=nn.Linear(512,10)defforward(self,x):x=self.pool1(self.relu1(self.bn1(self.conv1(x))))x=self.pool2(self.relu2(self.bn2(self.conv2(x))))x=self.pool3(self.relu3(self.bn3(self.conv3(x))))x=x.view(-1,128*4*4)x=self.fc2(self.dropout(self.relu3(self.fc1(x))))returnx# 通道注意力模块 (SE Block)classChannelAttention(nn.Module):def__init__(self,in_channels,reduction_ratio=16):super(ChannelAttention,self).__init__()self.avg_pool=nn.AdaptiveAvgPool2d(1)self.fc=nn.Sequential(nn.Linear(in_channels,in_channels//reduction_ratio,bias=False),nn.ReLU(inplace=True),nn.Linear(in_channels//reduction_ratio,in_channels,bias=False),nn.Sigmoid())defforward(self,x):b,c,_,_=x.size()y=self.avg_pool(x).view(b,c)y=self.fc(y).view(b,c,1,1)returnx*y# 带通道注意力的CNN模型classCNN_SE(nn.Module):def__init__(self):super(CNN_SE,self).__init__()self.conv1=nn.Conv2d(3,32,3,padding=1)self.bn1=nn.BatchNorm2d(32)self.relu1=nn.ReLU()self.ca1=ChannelAttention(32)self.pool1=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(32,64,3,padding=1)self.bn2=nn.BatchNorm2d(64)self.relu2=nn.ReLU()self.ca2=ChannelAttention(64)self.pool2=nn.MaxPool2d(2)self.conv3=nn.Conv2d(64,128,3,padding=1)self.bn3=nn.BatchNorm2d(128)self.relu3=nn.ReLU()self.ca3=ChannelAttention(128)self.pool3=nn.MaxPool2d(2)self.fc1=nn.Linear(128*4*4,512)self.dropout=nn.Dropout(p=0.5)self.fc2=nn.Linear(512,10)defforward(self,x):x=self.pool1(self.ca1(self.relu1(self.bn1(self.conv1(x)))))x=self.pool2(self.ca2(self.relu2(self.bn2(self.conv2(x)))))x=self.pool3(self.ca3(self.relu3(self.bn3(self.conv3(x)))))x=x.view(-1,128*4*4)x=self.fc2(self.dropout(self.relu3(self.fc1(x))))returnx

代码中定义了两个模型进行对比:

  1. 基础 CNN (CNN)
    • 包含 3 个卷积块(Conv -> BN -> ReLU -> MaxPool)。
    • 最后接全连接层进行分类。
  2. 带注意力的 CNN (CNN_SE)
    • 结构与基础 CNN 类似。
    • 关键区别:在每个卷积块的 ReLU 激活之后、池化之前,插入了ChannelAttention模块。

训练

  • 定义了train_and_log函数,统一管理训练循环。
  • 记录了每个 Epoch 和 Batch 的 Loss 及 Accuracy,并保存到 CSV 文件中以便后续分析。
  • 使用了Adam优化器和ReduceLROnPlateau学习率调度策略。

可视化

  1. 特征图可视化 (visualize_feature_maps)
    • 展示模型中间层(如 conv1, conv2, conv3)输出的特征图。
    • 帮助理解网络在不同深度提取了什么样的视觉特征(边缘、纹理、部件等)。
  2. 注意力热力图 (visualize_attention_map)
    • 提取卷积层输出,计算通道均值作为权重。
    • 将高响应的通道特征图叠加在原图上。
    • 作用:直观展示模型在进行分类决策时,主要“关注”图像的哪些区域(例如是否聚焦在物体主体上)。

总结

通过在卷积神经网络中引入通道注意力机制(SE Block),模型能够以极小的计算代价(少量的参数增加),显式地建模通道间的依赖关系,从而提升特征表示能力。这种机制是即插即用的,可以方便地集成到现有的 CNN 架构中。

@浙大疏锦行
Block),模型能够以极小的计算代价(少量的参数增加),显式地建模通道间的依赖关系,从而提升特征表示能力。这种机制是即插即用的,可以方便地集成到现有的 CNN 架构中。

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:42:41

PyTorch自定义Dataset类实现大规模图像读取优化

PyTorch自定义Dataset类实现大规模图像读取优化 在现代深度学习系统中,模型训练的瓶颈往往不在GPU算力本身,而在于数据能否“喂得够快”。尤其是在处理百万级图像数据集时,一个设计不佳的数据加载流程可能导致GPU利用率长期低于30%&#xff0…

作者头像 李华
网站建设 2026/4/16 6:00:02

GitHub Actions自动化测试PyTorch镜像构建稳定性

GitHub Actions自动化测试PyTorch镜像构建稳定性 在深度学习项目开发中,一个看似简单却频繁困扰团队的问题是:“为什么代码在我的机器上能跑,到了服务器就报错?” 更具体一点:CUDA 版本不匹配、PyTorch 安装失败、cuDN…

作者头像 李华
网站建设 2026/4/15 13:15:50

Anaconda+PyTorch环境迁移方案:跨机器复制配置

Anaconda PyTorch 环境迁移:如何实现跨机器的无缝复制 在深度学习项目中,你是否经历过这样的场景?——本地调试一切正常,代码提交后却在服务器上因“torch.cuda.is_available() 返回 False”而失败;或者团队成员反复询…

作者头像 李华
网站建设 2026/4/16 12:24:21

Android Framework高级工程师面试指南

天智伟业 Android Framework高级工程师 职位描述 工作职责 1、负责Android ROM定制,包括但不限于HAL层、Framework层、系统应用的裁剪、修改和定制 2、负责surfaceflinger、系统性能等功能模块优化 3、负责Android系统稳定性问题解决和性能优化,协助驱动和应用解决问题 4、负…

作者头像 李华
网站建设 2026/4/15 20:35:15

华硕笔记本风扇智能调节完全指南:G-Helper精准散热控制详解

华硕笔记本风扇智能调节完全指南:G-Helper精准散热控制详解 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项…

作者头像 李华
网站建设 2026/4/16 10:00:00

地应力平衡这活儿干过的都懂,手动调参简直能把人逼疯。今天给大家安利个解放双手的ABAQUS插件——ODB自动迭代平衡器,这玩意儿能让你从重复劳动中彻底解脱

ABAQUS-自动导入ODB进行地应力平衡的插件 本插件程序可通过自动迭代ODB实现地应力平衡插件核心逻辑其实就三步走:自动读取上次计算的ODB→判断应力收敛→生成新的输入文件接着算。我扒了扒源码发现,开发者用了个贼聪明的while循环结构: while…

作者头像 李华