【Block总结】HiLo注意力,局部自注意力捕获细粒度的高频信息,通过全局注意力捕获低频信息|即插即用
一、论文信息
- 标题: Fast Vision Transformers with HiLo Attention
- GitHub链接: https://github.com/ziplab/LITv2
- 论文链接: arXiv
二、创新点
-
HiLo注意力机制: 本文提出了一种新的自注意力机制——HiLo注意力,旨在同时捕捉图像中的高频和低频特征。该机制通过将自注意力分为两个分支,分别处理高频(Hi-Fi)和低频(Lo-Fi)信息,从而提高计算效率和模型性能[1][5][16]。
-
LITv2模型: 基于HiLo注意力机制,LITv2模型在多个计算机视觉任务上表现优越,尤其是在处理高分辨率图像时,显著提升了速度和准确性[1][5][16]。
-
相对位置编码优化: 采用3×3的深度卷积层替代传统的固定相对位置编码,进一步加快了密集预测任务的训练和推理速度[1][5][16]。
三、方法
-
整体架构: LITv2模型分为多个阶段,生成金字塔特征图,适用于密集预测任务。模型通过局部窗口自注意力捕捉细节,同时使用全局自注意力处理低频信息,确保性能与效率的平衡[1][5][16]。
-
特征处理: 输入图像被切分为固定大小的图像块(patch),每个patch通过线性变换映射到高维特征空间。HiLo注意力机制在每个Transformer模块中使用标准的残差连接和LayerNorm层,以稳定训练并保持特征传递[1][5][16]。
四、效果
-
性能提升: LITv2在标准基准测试中表现优于大多数现有的视觉Transformer模型,尤其在处理高分辨率图像时,HiLo机制在CPU上比传统的局部窗口注意力机制快1.6倍,比空间缩减注意力机制快1.4倍[1][5][16]。
-
计算效率: 通过将注意力机制分为高频和低频,LITv2能够有效减少计算量,同时保持或提升模型的准确性和速度[1][5][16]。
五、实验结果
-
基准测试: 论文中通过实际平台的速度评估,展示了LITv2在GPU和CPU上的优越性能。实验结果表明,HiLo注意力机制在多个视觉任务中均表现出色,尤其是在图像分类和物体检测任务中[1][5][16]。
-
FLOPs与吞吐量: 研究表明,HiLo机制在FLOPs、吞吐量和内存消耗方面均优于现有的注意力机制,证明了其在实际应用中的有效性[1][5][16]。
六、总结
Fast Vision Transformers with HiLo Attention通过引入HiLo注意力机制,成功地将高频和低频信息的处理分开,显著提升了视觉Transformer的性能和效率。LITv2模型在多个计算机视觉任务中表现优异,展示了其在实际应用中的潜力。该研究为未来的视觉模型设计提供了新的思路,尤其是在处理高分辨率图像时的计算效率和准确性方面[1][5][16]。
七、代码
import os
import torch
import torch.nn as nn
from timm.models.layers import DropPath, to_2tuple, trunc_normal_
import mathclass HiLo(nn.Module):"""HiLo AttentionLink: https://arxiv.org/abs/2205.13213"""def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0., window_size=2,alpha=0.5):super().__init__()assert dim % num_heads == 0, f"dim {dim} should be divided by num_heads {num_heads}."head_dim = int(dim / num_heads)self.dim = dim# self-attention heads in Lo-Fiself.l_heads = int(num_heads * alpha)# token dimension in Lo-Fiself.l_dim = self.l_heads * head_dim# self-attention heads in Hi-Fiself.h_heads = num_heads - self.l_heads# token dimension in Hi-Fiself.h_dim = self.h_heads * head_dim# local window size. The `s` in our paper.self.ws = window_sizeif self.ws == 1:# ws == 1 is equal to a standard multi-head self-attentionself.h_heads = 0self.h_dim = 0self.l_heads = num_headsself.l_dim = dimself.scale = qk_scale or head_dim ** -0.5# Low frequence attention (Lo-Fi)if self.l_heads > 0:if self.ws != 1:self.sr = nn.AvgPool2d(kernel_size=window_size, stride=window_size)self.l_q = nn.Linear(self.dim, self.l_dim, bias=qkv_bias)self.l_kv = nn.Linear(self.dim, self.l_dim * 2, bias=qkv_bias)self.l_proj = nn.Linear(self.l_dim, self.l_dim)# High frequence attention (Hi-Fi)if self.h_heads > 0:self.h_qkv = nn.Linear(self.dim, self.h_dim * 3, bias=qkv_bias)self.h_proj = nn.Linear(self.h_dim, self.h_dim)def hifi(self, x):B, H, W, C = x.shapeh_group, w_group = H // self.ws, W // self.wstotal_groups = h_group * w_groupx = x.reshape(B, h_group, self.ws, w_group, self.ws, C).transpose(2, 3)qkv = self.h_qkv(x).reshape(B, total_groups, -1, 3, self.h_heads, self.h_dim // self.h_heads).permute(3, 0, 1,4, 2, 5)q, k, v = qkv[0], qkv[1], qkv[2] # B, hw, n_head, ws*ws, head_dimattn = (q @ k.transpose(-2, -1)) * self.scale # B, hw, n_head, ws*ws, ws*wsattn = attn.softmax(dim=-1)attn = (attn @ v).transpose(2, 3).reshape(B, h_group, w_group, self.ws, self.ws, self.h_dim)x = attn.transpose(2, 3).reshape(B, h_group * self.ws, w_group * self.ws, self.h_dim)x = self.h_proj(x)return xdef lofi(self, x):B, H, W, C = x.shapeq = self.l_q(x).reshape(B, H * W, self.l_heads, self.l_dim // self.l_heads).permute(0, 2, 1, 3)if self.ws > 1:x_ = x.permute(0, 3, 1, 2)x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1)kv = self.l_kv(x_).reshape(B, -1, 2, self.l_heads, self.l_dim // self.l_heads).permute(2, 0, 3, 1, 4)else:kv = self.l_kv(x).reshape(B, -1, 2, self.l_heads, self.l_dim // self.l_heads).permute(2, 0, 3, 1, 4)k, v = kv[0], kv[1]attn = (q @ k.transpose(-2, -1)) * self.scaleattn = attn.softmax(dim=-1)x = (attn @ v).transpose(1, 2).reshape(B, H, W, self.l_dim)x = self.l_proj(x)return xdef forward(self, x):B, N, C = x.shapeH = W = int(N ** 0.5)x = x.reshape(B, H, W, C)if self.h_heads == 0:x = self.lofi(x)return x.reshape(B, N, C)if self.l_heads == 0:x = self.hifi(x)return x.reshape(B, N, C)hifi_out = self.hifi(x)lofi_out = self.lofi(x)x = torch.cat((hifi_out, lofi_out), dim=-1)x = x.reshape(B, N, C)return xdef flops(self, N):H = int(N ** 0.5)# when the height and width cannot be divided by ws, we pad the feature map in the same way as Swin Transformer for object detection/segmentationHp = Wp = self.ws * math.ceil(H / self.ws)Np = Hp * Wp# For Hi-Fi# qkvhifi_flops = Np * self.dim * self.h_dim * 3nW = Np / self.ws / self.wswindow_len = self.ws * self.ws# q @ k and attn @ vwindow_flops = window_len * window_len * self.h_dim * 2hifi_flops += nW * window_flops# projectionhifi_flops += Np * self.h_dim * self.h_dim# for Lo-Fi# qlofi_flops = Np * self.dim * self.l_dim# H = int(Np ** 0.5)kv_len = (Hp // self.ws) ** 2# k, vlofi_flops += kv_len * self.dim * self.l_dim * 2# q @ k and attn @ vlofi_flops += Np * self.l_dim * kv_len * 2# projectionlofi_flops += Np * self.l_dim * self.l_dimreturn hifi_flops + lofi_flopsif __name__ == "__main__":dim=256# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, height, width,channels)x = torch.randn(1,40*40,dim).to(device)# 初始化 HWD 模块block = HiLo(dim)print(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)
输出结果:
相关文章:

【Block总结】HiLo注意力,局部自注意力捕获细粒度的高频信息,通过全局注意力捕获低频信息|即插即用
一、论文信息 标题: Fast Vision Transformers with HiLo AttentionGitHub链接: https://github.com/ziplab/LITv2论文链接: arXiv 二、创新点 HiLo注意力机制: 本文提出了一种新的自注意力机制——HiLo注意力,旨在同时捕捉图像中的高频和低频特征。该机制通过将…...
python 使用Whisper模型进行语音翻译
目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…...

C# Winform enter键怎么去关联button
1.关联按钮上的Key事件按钮上的keypress,keydown,keyup事件随便一个即可private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode Keys.Enter){this.textBox2.Focus();}}2.窗体上的事件private void textBox2_KeyPress(object sen…...

Github 2025-01-30 Go开源项目日报 Top10
根据Github Trendings的统计,今日(2025-01-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…...

电路研究9.2.6——合宙Air780EP中HTTP——HTTP GET 相关命令使用方法研究
这个也是一种协议类型: 14.16 使用方法举例 根据之前多种类似的协议的相关信息: HTTP/HTTPS:超文本传输协议(HTTP)用于Web数据的传输,而HTTPS是HTTP的安全版本,使用SSL/TLS进行加密。与FTP相比&…...
Java手写简单Merkle树
Java手写Merkle树代码 package com.blockchain.qgy.component;import com.blockchain.qgy.model.MerkleTreeNode; import com.blockchain.qgy.util.SHAUtil;import java.util.*;public class MerkleTree<T> {//merkle树private List<MerkleTreeNode<T>> lis…...

DeepSeek的使用技巧介绍
DeepSeek是一款由杭州深度求索人工智能技术有限公司开发的AI工具,结合了自然语言处理和深度学习技术,能够完成多种任务,如知识问答、数据分析、文案创作、代码开发等。以下将从使用技巧、核心功能及注意事项等方面详细介绍DeepSeek的使用方法…...
19 压测和常用的接口优化方案
高并发的平台应用,项目上线前离不开一个重要步骤就是压测,压测对于编码中的资源是否问题的排查,性能的调优都是离不开的。测试还要做测试报告,出具了测试报告给到运维团队才能上线。 压测的测试报告主要有以下几个方面:1.响应时间…...
AI应用部署——streamlit
如何把项目部署到一个具有公网ip地址的服务器上,让他人看到? 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库,也包括这些库的…...

NLP自然语言处理通识
目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 二、ELMo的模型结构与技术逻辑 1. 双向语言模型(BiLM) 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的…...
C++ 6
C构造函数有几种,分别什么作用 在C中,构造函数有几种不同的类型,每种都有其特定的作用: 默认构造函数:没有参数的构造函数,用于创建对象的默认实例。参数化构造函数:带参数的构造函数…...
使用QSqlQueryModel创建交替背景色的表格模型
class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role Qt.BackgroundRole…...
jinfo命令详解
jinfo [option]option 有以下这些选项参数 -flag : 打印 指定名称的 jvm 参数值;-flag [|-] : 启动或禁用指定名称的 jvm参数;-flag : 设置指定名称的 jvm 参数值;-sysprops: 打印 java 系统属性-h | -help: 打印 jinfo 命令帮助信息 1&…...

如何在 ACP 中建模复合罐
概括 本篇博文介绍了 ANSYS Composite PrepPost (ACP) 缠绕向导。此工具允许仅使用几个条目自动定义高压罐中常见的悬垂复合结构。 ACP 绕线向导 将必要的信息输入到绕组向导中。重要的是要注意“参考半径”,它代表圆柱截面的半径,以及“轴向”&#x…...

【Java】微服务找不到问题记录can not find user-service
一、问题描述 运行网关微服务与用户微服务后,nacos服务成功注册 但是测试接口的时候网关没有找到相关服务 二、解决方案 我先检查了pom文件确定没问题后查看配置文件 最后发现是配置里spring.application.namexxx-user里面服务的名字后面多了一个空格 三、总结…...
基于Hutool的Merkle树hash值生成工具
SHAUtil工具 package com.blockchain.qgy.util;import com.xiaoleilu.hutool.crypto.digest.DigestUtil; import org.apache.commons.codec.binary.Hex;import java.nio.charset.StandardCharsets; import java.security.MessageDigest;/**** 生成SHA-256的工具** author QGY*…...

Windows系统本地部署deepseek 更改目录
本地部署deepseek 无论是mac还是windows系统本地部署deepseek或者其他模型的命令和步骤是一样的。 可以看: 本地部署deepsek 无论是ollama还是部署LLM时候都默认是系统磁盘,对于Windows系统,我们一般不把应用放到系统盘(C:)而是…...
深度学习篇---数据存储类型
文章目录 前言第一部分:C语言中的数据存储类型1. char(通常是8位)优点缺点 2. short(通常是16位)优点缺点 3. int(通常是32位)优点缺点 4. long(通常是32位或64位)优点缺…...
可被electron等调用的Qt截图-录屏工具【源码开放】
1. 工具功能简介: (1)、QT5.15.2截图工具(exe)可单独使用或嵌入IM(嵌入方法参照:https://gitee.com/lykiao/yfscreenshot_release) (2)、支持通过Windows消息通知截图成功或取消 (3)、支持圆形、矩形、线条…...
electron 应用开发实践
参考链接: https://blog.csdn.net/2401_83384536/article/details/140549279...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...