图解LeViT架构:CNN混合骨干与注意力Transformer如何协同,平衡图像分类的速度与精度

【免费下载链接】LeViT LeViT a Vision Transformer in ConvNet's Clothing for Faster Inference 【免费下载链接】LeViT 项目地址: https://gitcode.com/gh_mirrors/le/LeViT

LeViT 是一个"穿上 CNN 外衣"的视觉 Transformer 模型,专为更快推理而生。它在 ImageNet 图像分类任务上实现了速度与精度的出色平衡:最小版本 LeViT-128S 仅 7.8M 参数即可达到 76.6% top-1 精度,最大版本 LeViT-384 则达到 82.6%。本文带你图解 LeViT 的混合架构设计,看清卷积骨干与注意力机制是如何分工协作的。

LeViT混合视觉Transformer的速度与精度权衡曲线对比图

如上图所示,绿色曲线代表 LeViT 系列(LeViT-128S 到 LeViT-384),无论是单核 CPU 还是单卡 GPU 场景,它都稳定位于 EfficientNet(蓝色)与 DeiT(橙色)的上方——同样的速度下精度更高,同样的精度下速度更快。这就是 LeViT 的核心卖点。🚀

为什么需要"混合架构"的视觉 Transformer?

纯 Transformer 做图像分类有一个绕不开的痛点:自注意力计算量随 token 数量平方级增长。把 224×224 的图像切成 16×16 的 patch,就会得到 196 个 token,注意力矩阵开销不小。

LeViT 的思路很巧妙:

  • 前端用卷积:卷积局部性强、参数少,负责"压缩"图像信息
  • 后端用注意力:让全局感受野弥补卷积的局部性短板
  • 全程 4D 张量:不展平为 token 序列,避免额外的矩阵转置开销

这种"CNN 混合骨干 + 注意力 Transformer"的分工,正是速度与精度兼得的关键。

一图看懂 LeViT 整体结构

LeViT 的前向流程可以拆成三步,核心实现都在 levit.pyLeViT 类中:

① 卷积 Stem(b16) 输入图像先经过 4 层 Conv2d_BN 卷积块,每层 stride=2,分辨率从 224 → 112 → 56 → 28。它同时完成了"降采样 + 特征提取 + 通道扩张"三件事,大幅减少了进入 Transformer 阶段的 token 数量——28×28 的网格而非 196 个零散 patch。

② 三段式注意力骨干 骨干由 3 个 stage 组成,每段包含若干个「注意力块 + MLP 块」:

Stage 分辨率 通道数(C) 注意力头数 块数
1 14×14 128 4 4
2 7×7 256 8 8
3 4×4 384 12 8~12

分辨率逐段减半(14→7→4),通道数逐段增加,这是典型的倒漏斗式缩放策略。

③ 分类头 最后对特征做全局平均池化,再经过 BN_Linear 输出 1000 类 logits。

CNN 与注意力如何协同?三个关键设计

1x1 卷积生成 QKV,而非全连接层

注意力模块中的 Query/Key/Value 投影用的是 Conv2d_BN(1×1 卷积 + 批归一化),而不是普通 Linear。1×1 卷积在硬件上更友好,且 BN 能稳定训练——这是 LeViT 推理快的底层原因之一。

相对位置偏置(Attention Bias)

LeViT 的 Attention 类会预计算每个 token 对之间的位置偏移,为每种偏移学习一个可训练偏置,加到注意力分数上。这样模型既能感知空间位置,又不用为每个位置单独存参数,省内存且不损失归纳偏置。

AttentionSubsample:注意力参与下采样

普通模型降分辨率靠池化,LeViT 则用 AttentionSubsample 模块:Query 来自"跳采"后的稀疏点(stride=2),Key/Value 来自稠密点,通过一次注意力完成下采样 + 特征重排。降分辨率的同时不丢信息,代码见 levit.pySubsampleAttentionSubsample 两个类。

💡 项目里还有 levit_c.py,它是 LeViT 的 channel-last(4D 张量)变体,注意力直接在 B, C, H, W 形状上计算,适合特定推理引擎优化。

5 个模型档位:按需选择速度与精度

训练好的模型覆盖了 305M~2353M FLOPs 的完整区间,完整列表见 README.md 的 Model Zoo:

模型 acc@1 #FLOPs #Params 适合场景
LeViT-128S 76.6% 305M 7.8M 移动端 / CPU 单线程
LeViT-128 78.6% 406M 9.2M 轻量部署
LeViT-192 80.0% 658M 11M 均衡之选
LeViT-256 81.6% 1120M 19M 服务端主力
LeViT-384 82.6% 2353M 39M 精度优先

选型口诀:追求吞吐选 128S,追求精度选 384,大多数业务 256 刚刚好。

快速上手:三步跑通 LeViT 评估

第一步:克隆仓库

git clone https://gitcode.com/gh_mirrors/le/LeViT

第二步:安装依赖(PyTorch 1.7.0+、torchvision 0.8.1+ 和 timm)

conda install -c pytorch pytorch torchvision
pip install timm

第三步:单 GPU 评估 LeViT-256

python main.py --eval --model LeViT_256 --data-path /path/to/imagenet

预期输出 Acc@1 81.636。训练脚本同样在 main.py 中,蒸馏损失实现位于 losses.py(支持 soft / hard 两种知识蒸馏),吞吐测试可以用 speed_test.py

📌 小技巧:推理部署时打开 fuse=True 参数,会把 BatchNorm 折叠进卷积和线性层(见 utils.pyreplace_batchnorm),进一步减少算子数量。

核心文件地图

文件 作用
levit.py LeViT 主实现(token 序列版)
levit_c.py LeViT 4D 张量版实现
hubconf.py 预训练模型 Hub 入口
main.py 训练与评估入口
losses.py 知识蒸馏损失
speed_test.py CPU/GPU 吞吐基准测试
datasets.py ImageNet 数据加载

总结:LeViT 快在哪里?

  1. 卷积 Stem 先压缩:224→28 降 8 倍,token 数直接打 4 折
  2. 注意力用 1×1 卷积投影:硬件友好 + BN 稳定训练
  3. 相对位置偏置:位置信息可学习且省参数
  4. 注意力式下采样:降分辨率不靠粗暴池化
  5. 蒸馏 + BN 融合:精度与部署两头兼顾

如果你正在寻找一个"比 EfficientNet 更平滑、比 DeiT 更可控"的图像分类骨干,LeViT 值得放进你的模型工具箱。✅

【免费下载链接】LeViT LeViT a Vision Transformer in ConvNet's Clothing for Faster Inference 【免费下载链接】LeViT 项目地址: https://gitcode.com/gh_mirrors/le/LeViT

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐