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

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息

  • 标题: VOLO: Vision Outlooker for Visual Recognition
  • 作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan
  • 代码链接: https://github.com/sail-sg/volo
  • 论文链接: https://arxiv.org/pdf/2106.13112
    在这里插入图片描述

创新点

  • 前景注意力机制: VOLO引入了一种称为“outlook attention”的新型注意力机制,能够动态地在输入图像上进行局部特征聚合。这种机制专注于编码细粒度特征,而不是传统自注意力机制所关注的全局依赖性,从而提高了模型在视觉识别任务中的表现。
  • 高效的特征编码: VOLO通过滑动窗口的方式进行局部特征聚合,打破了自注意力机制在计算复杂度上的瓶颈,使得模型在内存使用上更加高效。
    在这里插入图片描述

方法

  • 模型架构: VOLO的架构相对简单,主要包括以下几个部分:
    • Outlook Attention: 该机制通过局部窗口内的相似度计算生成注意力权重,有效地聚合细粒度特征。
    • 多层感知机(MLP): 用于进一步处理和整合特征,增强模型的表达能力。

实验结果

  • ImageNet-1K分类任务: VOLO在该任务中实现了87.1%的top-1准确率,成为首个在该数据集上超过87%准确率的模型,且未使用任何额外训练数据。与其他模型相比,VOLO在参数量仅为296M的情况下,表现出色,显示出其高效性。
  • 下游任务表现: VOLO在CityScapes和ADE20K等下游任务中也表现优异,分别取得了84.3%和54.3%的mIoU(平均交并比)得分,证明了其良好的迁移学习能力。

总结

VOLO通过引入前景注意力机制和高效的特征编码方法,显著提升了视觉识别模型的性能,尤其是在细粒度特征的处理上。该模型在多个标准数据集上取得了优异的成绩,为未来的视觉识别研究提供了新的思路和方向。VOLO的设计理念和实验结果表明,基于注意力的模型在视觉识别领域具有广泛的应用潜力。

代码

import torch
import torch.nn as nn
import math
import torch.nn.functional as Fclass OutlookAttention(nn.Module):"""Implementation of outlook attention--dim: hidden dim--num_heads: number of heads--kernel_size: kernel size in each window for outlook attentionreturn: token features after outlook attention"""def __init__(self, dim, num_heads, kernel_size=3, padding=1, stride=1,qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):super().__init__()head_dim = dim // num_headsself.num_heads = num_headsself.kernel_size = kernel_sizeself.padding = paddingself.stride = strideself.scale = qk_scale or head_dim**-0.5self.v = nn.Linear(dim, dim, bias=qkv_bias)self.attn = nn.Linear(dim, kernel_size**4 * num_heads)self.attn_drop = nn.Dropout(attn_drop)self.proj = nn.Linear(dim, dim)self.proj_drop = nn.Dropout(proj_drop)self.unfold = nn.Unfold(kernel_size=kernel_size, padding=padding, stride=stride)self.pool = nn.AvgPool2d(kernel_size=stride, stride=stride, ceil_mode=True)def forward(self, x):B, H, W, C = x.shapev = self.v(x).permute(0, 3, 1, 2)  # B, C, H, Wh, w = math.ceil(H / self.stride), math.ceil(W / self.stride)v = self.unfold(v).reshape(B, self.num_heads, C // self.num_heads,self.kernel_size * self.kernel_size,h * w).permute(0, 1, 4, 3, 2)  # B,H,N,kxk,C/Hattn = self.pool(x.permute(0, 3, 1, 2)).permute(0, 2, 3, 1)attn = self.attn(attn).reshape(B, h * w, self.num_heads, self.kernel_size * self.kernel_size,self.kernel_size * self.kernel_size).permute(0, 2, 1, 3, 4)  # B,H,N,kxk,kxkattn = attn * self.scaleattn = attn.softmax(dim=-1)attn = self.attn_drop(attn)x = (attn @ v).permute(0, 1, 4, 3, 2).reshape(B, C * self.kernel_size * self.kernel_size, h * w)x = F.fold(x, output_size=(H, W), kernel_size=self.kernel_size,padding=self.padding, stride=self.stride)x = self.proj(x.permute(0, 2, 3, 1))x = self.proj_drop(x)return xif __name__ == "__main__":# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, height, width,channels)x = torch.randn(1,40,40,32).to(device)# 初始化 OutlookAttention 模块dim=32block = OutlookAttention(dim,8)print(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)

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

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

相关文章:

  • 网络攻防实战指北专栏讲解大纲与网络安全法
  • 【已解决】windows7虚拟机安装VMtools频繁报错
  • 蓝桥杯模拟算法:多项式输出
  • 冲刺蓝桥杯之速通vector!!!!!
  • 知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析
  • IT服务管理平台(ITSM):构建高效运维体系的基石
  • [EAI-026] DeepSeek-VL2 技术报告解读
  • 深度学习:基于MindNLP的RAG应用开发
  • 【C语言】static关键字的三种用法
  • STM32 PWMI模式测频率占空比
  • 神经网络|(四)概率论基础知识-古典概型
  • ubuntu20.04.6下运行VLC-Qt例子simple-player
  • 低代码产品插件功能一览
  • Blazor-@bind
  • RK3568中使用QT opencv(显示基础图像)
  • [答疑]DDD伪创新哪有资格和仿制药比
  • C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示
  • DIY QMK量子键盘
  • C++ 堆栈分配的区别
  • 范冰冰担任第75届柏林电影节主竞赛单元评委 共鉴电影佳作
  • Pandas进行MongoDB数据库CRUD
  • 《DeepSeek 实用集成:大模型能力接入各类软件》
  • 适配Android16
  • 如何用 Groq API 免费使用 DeepSeek-R1 70B,并通过 Deno 实现国内访问
  • iperf 测 TCP 和 UDP 网络吞吐量
  • Autogen_core: Model Context
  • SpringBoot AOP 和 事务
  • Ubuntu全面卸载mysql
  • android的gradle
  • 前端开发之jsencrypt加密解密的使用方法和使用示例