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

【Block总结】PSA,金字塔挤压注意力,解决传统注意力机制在捕获多尺度特征时的局限性

论文信息

  • 标题: EPSANet: An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network
  • 论文链接: arXiv
  • GitHub链接: https://github.com/murufeng/EPSANet

在这里插入图片描述

创新点

EPSANet提出了一种新颖的金字塔挤压注意力(PSA)模块,旨在解决传统注意力机制在捕获多尺度特征时的局限性。其主要创新点包括:

  1. 高效性: PSA模块能够在较低的计算成本下有效提取多尺度空间信息。
  2. 灵活性: 该模块可以作为即插即用的组件,轻松集成到现有的卷积神经网络(CNN)架构中。
  3. 多尺度特征表示: EPSANet通过自适应地重新校准跨维通道的注意权重,增强了特征表示能力。

方法

EPSANet的核心是PSA模块,其实现过程如下:

  1. 多尺度特征提取: 通过Squeeze and Concat (SPC)模块获得通道维度上的多尺度特征图。
  2. 注意力计算: 使用SEWeight模块提取不同尺度特征图的注意力,生成通道方向的注意力向量。
  3. 再校准: 通过Softmax对通道维度的注意向量进行再校准,得到多尺度信道的再校准权重。
  4. 特征融合: 在重新校准的权重和对应的特征图上进行按元素乘积,输出丰富的多尺度特征图。
    在这里插入图片描述

效果

EPSANet在多个计算机视觉任务中表现出色,包括图像分类、目标检测和实例分割。与传统的通道注意力方法相比,EPSANet在性能上有显著提升。例如:

  • 在ImageNet数据集上,EPSANet的Top-1准确率比SENet-50提高了1.93%。
  • 在MS-COCO数据集上,使用Mask-RCNN时,EPSANet在目标检测和实例分割任务中分别提高了2.7和1.7的AP值。

实验结果

实验结果表明,EPSANet在多个标准数据集上均超越了当前最新的技术。具体表现为:

  • 在COCO 2017数据集上,EPSANet的目标检测率超越了ECANet,AP75指标提高了1.4%。
  • 论文中进行了大量的定性和定量实验,验证了EPSANet在图像分类、目标检测和实例分割方面的先进性能。

总结

EPSANet通过引入金字塔挤压注意力模块,成功地提升了卷积神经网络在多尺度特征提取方面的能力。其灵活的设计使得EPSANet能够广泛应用于各种计算机视觉任务,展现出良好的泛化性能和高效性。该研究为未来的深度学习模型设计提供了新的思路和方法。

代码

import torch
import torch.nn as nnclass SEWeightModule(nn.Module):def __init__(self, channels, reduction=16):super(SEWeightModule, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc1 = nn.Conv2d(channels, channels//reduction, kernel_size=1, padding=0)self.relu = nn.ReLU(inplace=True)self.fc2 = nn.Conv2d(channels//reduction, channels, kernel_size=1, padding=0)self.sigmoid = nn.Sigmoid()def forward(self, x):out = self.avg_pool(x)out = self.fc1(out)out = self.relu(out)out = self.fc2(out)weight = self.sigmoid(out)return weightdef conv(in_planes, out_planes, kernel_size=3, stride=1, padding=1, dilation=1, groups=1):"""standard convolution with padding"""return nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride,padding=padding, dilation=dilation, groups=groups, bias=False)def conv1x1(in_planes, out_planes, stride=1):"""1x1 convolution"""return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)class PSAModule(nn.Module):def __init__(self, inplans, planes, conv_kernels=[3, 5, 7, 9], stride=1, conv_groups=[1, 4, 8, 16]):super(PSAModule, self).__init__()self.conv_1 = conv(inplans, planes//4, kernel_size=conv_kernels[0], padding=conv_kernels[0]//2,stride=stride, groups=conv_groups[0])self.conv_2 = conv(inplans, planes//4, kernel_size=conv_kernels[1], padding=conv_kernels[1]//2,stride=stride, groups=conv_groups[1])self.conv_3 = conv(inplans, planes//4, kernel_size=conv_kernels[2], padding=conv_kernels[2]//2,stride=stride, groups=conv_groups[2])self.conv_4 = conv(inplans, planes//4, kernel_size=conv_kernels[3], padding=conv_kernels[3]//2,stride=stride, groups=conv_groups[3])self.se = SEWeightModule(planes // 4)self.split_channel = planes // 4self.softmax = nn.Softmax(dim=1)def forward(self, x):batch_size = x.shape[0]x1 = self.conv_1(x)x2 = self.conv_2(x)x3 = self.conv_3(x)x4 = self.conv_4(x)feats = torch.cat((x1, x2, x3, x4), dim=1)feats = feats.view(batch_size, 4, self.split_channel, feats.shape[2], feats.shape[3])x1_se = self.se(x1)x2_se = self.se(x2)x3_se = self.se(x3)x4_se = self.se(x4)x_se = torch.cat((x1_se, x2_se, x3_se, x4_se), dim=1)attention_vectors = x_se.view(batch_size, 4, self.split_channel, 1, 1)attention_vectors = self.softmax(attention_vectors)feats_weight = feats * attention_vectorsfor i in range(4):x_se_weight_fp = feats_weight[:, i, :, :]if i == 0:out = x_se_weight_fpelse:out = torch.cat((x_se_weight_fp, out), 1)return outif __name__ == "__main__":dim=512# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, channels,height, width)x = torch.randn(1,dim,14,14).to(device)# 初始化 PSAModule 模块block = PSAModule(dim,dim) # kernel_size为height或者widthprint(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)

输出结果:
在这里插入图片描述

http://www.lryc.cn/news/533016.html

相关文章:

  • 代码随想录算法训练营第三十一天| 回溯算法04
  • pycharm集成通义灵码应用
  • 赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
  • 【Leetcode刷题记录】54. 螺旋矩阵--模拟,以及循环条件处理的一些细节
  • c++计算机教程
  • 蓝桥杯Java之输入输出练习题
  • 【R语言】环境空间
  • 【系统架构设计师】分布式数据库透明性
  • openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包
  • OpenCV:图像修复
  • QT全局所有QSS样式实时切换
  • MySQL三大版本的演进
  • 利用 IMU 估计人体关节轴向和位置 —— 论文推导
  • 脚本一键生成管理下游k8s集群的kubeconfig
  • 数据库系统概念第六版记录 三
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-files.py
  • 微信小程序案例1——制作猫眼电影底部标签导航栏
  • 【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
  • 【服务器知识】如何在linux系统上搭建一个nfs
  • 图片画质增强:轻松提升画质
  • vscode快速接入deepseek 实践操作
  • mapbox进阶,添加绘图扩展插件,绘制圆形
  • Cursor 与多语言开发:全栈开发的利器
  • 2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
  • FPGA的IP核接口引脚含义-快解
  • 数据库高安全—审计追踪:传统审计统一审计
  • 机器学习 - 需要了解的条件概率、高斯分布、似然函数
  • Spring Boot Web 入门
  • 神经网络|(八)概率论基础知识-二项分布及python仿真
  • 【面试场景】MySQL分布式主键选取