news 2026/5/1 4:54:31

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/29 9:09:50

项目应用:在Docker中配置兼容CUDA 11.0的运行时环境

如何在 Docker 中构建稳定可靠的 CUDA 11.0 运行环境?——从“ libcudart.so.11.0 找不到”说起 你有没有遇到过这样的场景:本地训练模型一切正常,一到服务器上跑容器就报错: ImportError: libcudart.so.11.0: cannot open sh…

作者头像 李华
网站建设 2026/4/27 7:41:21

OEM出厂镜像中Synaptics触控功能失效的排查与修复实战

OEM镜像部署后Synaptics触控失灵?从ACPI到驱动注入的全链路实战修复 你有没有遇到过这样的情况:一批新设备烧录完标准OEM镜像,开机后却发现触摸板完全没反应——手指在板子上滑了半天,光标纹丝不动。设备管理器里不显示“Synapti…

作者头像 李华
网站建设 2026/5/1 4:12:34

WSL2下安装PyTorch-GPU版本的完整踩坑记录与总结

WSL2 下 PyTorch-GPU 环境搭建:从踩坑到高效开发的实战指南 在深度学习项目中,环境配置往往比模型调参更让人头疼。尤其是对 Windows 用户而言,想用上 GPU 加速的 PyTorch 开发环境,过去几乎意味着必须双系统、虚拟机折腾一番&am…

作者头像 李华
网站建设 2026/4/25 23:19:02

SSH连接超时处理策略:保持PyTorch训练会话稳定

SSH连接超时处理策略:保持PyTorch训练会话稳定 在深度学习项目中,最令人沮丧的场景之一莫过于:你启动了一个长达24小时的模型训练任务,合上笔记本去开会,几个小时后回来却发现SSH连接已断,终端进程被终止—…

作者头像 李华
网站建设 2026/4/22 23:00:55

Anaconda创建独立环境隔离不同PyTorch项目依赖

Anaconda创建独立环境隔离不同PyTorch项目依赖 在深度学习项目的日常开发中,你是否遇到过这样的场景:刚为一个图像分割任务配置好的 PyTorch v2.6 环境,结果接手另一个需要兼容旧版 API 的项目时,运行 import torch 就直接报错&am…

作者头像 李华
网站建设 2026/5/1 3:28:05

Markdown技术文档写作技巧:围绕PyTorch关键词优化SEO

PyTorch 技术写作与容器化实践:如何打造高价值开发者文档 在深度学习领域,一个令人熟悉的场景是:研究者或工程师花费数小时甚至一整天来配置环境——安装 CUDA、匹配 cuDNN 版本、解决 PyTorch 与 Python 的依赖冲突……而真正用于模型开发的…

作者头像 李华