首页
/ timm(PyTorch Image Models)权威指南:模型库、训练脚本、优化器生态与预训练权重体系全解析

timm(PyTorch Image Models)权威指南:模型库、训练脚本、优化器生态与预训练权重体系全解析

2026-09-05 17:39:45作者:冯爽妲Honey

本文基于 README.md 梳理 timm(PyTorch Image Models)的项目定位、模型家族矩阵、优化器/数据增强/正则化生态,以及训练、验证、推理脚本的用法;结合仓库源码中的模型工厂、优化器注册表与结果目录,帮助读者掌握"如何选模型、如何加载权重、如何跑通训练与验证"的完整技术链路,并理解各配置项背后的实现机制。

1. 项目定位:什么是 timm

README 对项目的定义是:

PyTorch Image Models(timm)是一个图像模型、层、工具函数、优化器、调度器、数据加载器/增广,以及参考训练/验证脚本的集合,目标是汇聚各类 SOTA 模型,并具备复现 ImageNet 训练结果的能力。

从仓库结构看,timm 并非单一模型仓库,而是一个"模型 + 训练基础设施"平台:

组成部分 对应路径 说明
模型定义 timm/models/ 100+ 架构家族,每个家族一个模块文件(如 resnet.pyvision_transformer.pyswin_transformer.pyconvnext.py
通用层库 timm/layers/ 卷积/归一化/激活工厂、注意力模块、DropPath/DropBlock、模糊池化等
优化器 timm/optim/ 30 余种优化器实现与统一工厂
学习率调度 timm/scheduler/ stepcosine(含重启)、tanh(含重启)、plateau
数据与增广 timm/data/ 数据集工厂、Mixup/CutMix/AutoAugment/RandAugment、NaFlex 变长管线
参考脚本 train.pyvalidate.pyinference.pybenchmark.py 多进程/多 GPU 模式可复现训练脚本
结果与基准 results/ ImageNet 系列验证集精度 CSV + 各 GPU/精度组合推理基准

当前开发版本号为 1.0.29.dev0,见 timm/version.py;测试矩阵按 README 记载覆盖 PyTorch 1.13 + Python 3.10(下限)至 PyTorch 2.9.1 + Python 3.13(上限),使用新版本时请以 tests/ 中的用例为验证依据。

2. 近期演进(What's New 精读)

README 的 "What's New" 章节是跟踪项目能力边界的最快方式,以下是与技术选型强相关的近期节点:

  • 2026-08-11:新增 CPUBone(面向低并行能力设备的骨干网)、PP-LCNetV2 模型定义与预训练权重;为非 NaFlex 训练引入按批次的图像/批大小调度(含由小到大的渐进分辨率调度);NaFlexViT 支持仅 key 的注意力掩码、对 compile 更友好的位置采样与缓存化的可变 patch 插值;改进模型工厂路径与 checkpoint 处理。
  • 2026-07-10:优化器支持 torch.compile 与张量学习率;NaFlexViT 扩展 patch 布局(面向 NaFlex-CLAP);加固 pickle 加载与自定义标签推理;发布 1.0.28。
  • 2026-03-23(1.0.26):checkpoint 默认 weights_only=True 加载;改进核心 ViT/EVA 模型的注意力掩码处理;ViT 新增 Patch Representation Refinement(PRR) 池化选项;Hiera 引入 F.SDPA 优化以启用 Flash Attention 内核。
  • 2025-10-16(1.0.21):新增 Muon 优化器实现(对卷积权重与不适合正交化的参数形状有回退策略,默认回退 AdamW/NAdamW 更新);初步支持 'meta' 设备模型初始化,所有模型与模块支持 device/dtype 工厂关键字参数;预训练配置中加入 license 字段。
  • 2025-09-17:加入 DINOv3 的 ConvNeXt 与 ViT 模型(ViT 经由 EVA 基类 + 新增 RotaryEmbeddingDinoV3 实现);新增 MobileCLIP-2、MetaCLIP-2、SigLIP-2 NaFlex 编码器。
  • 2025-06-05:NaFlexViT 初版落地,支持可变长宽比/分辨率(SigLIP-2)、可变 patch 大小(FlexiViT)、分数/分解位置编码(NaViT);既有 vision_transformer.py 的 ViT 可通过 create_model(..., use_naflex=True) 载入 NaFlexViT。

这些条目说明项目当前的两条主线:视觉编码器权重生态持续扩张(自监督/多模态编码器转分类头)训练基础设施工程化(meta 设备、compile 友好、NaFlex 可变分辨率管线)

3. 模型体系:从家族矩阵到源码文件

README 列出了几乎所有主流 ImageNet 骨干的复现家族。为便于检索,下表给出"家族 → 源码文件"的映射(均为仓库内实际存在的文件),外部论文链接不在此重复,可按模型名在对应文件 docstring 中查证出处:

家族 源码文件 家族 源码文件
ResNet / ResNeXt / v2 timm/models/resnet.pyresnetv2.py Vision Transformer(ViT、AugReg、SBB 等) timm/models/vision_transformer.py
ResNeSt / Res2Net / ResMLP resnest.pyres2net.py Swin Transformer / V2 swin_transformer.pyswin_transformer_v2.py
SENet 家族(SE/ECAResNet/SK) senet.pysknet.py ConvNeXt(含 ConvNeXt-V2) convnext.py
EfficientNet 家族(B0-B8、V2、NoisyStudent、AdvProp、pruned) efficientnet.py EVA / DINOv3 / PE ViT(RoPE 家族) eva.py
MobileNet-V2/V3/V4/V5、MobileViT(-V2) mobilenetv3.pymobilenetv5.py NaFlexViT(NaViT/FlexiViT/SigLIP-2) naflexvit.py
RegNet / ReXNet / RepVGG regnet.pyrexnet.py MixNet / MNASNet / NASNet mixnet(MBConv 家族统一实现)
DenseNet / DLA / DPN / VoVNet densenet.pydla.pydpn.pyvovnet.py CSPNet(ResNet/ResNeXT) cspnet.py
Inception 家族 inception_v3.pyinception_v4.py 高效 CNN(EdgeNeXt、FasterNet、GhostNet、LCNetV2) edgenext.pyfasternet.pyghostnet.pylcnetv2.py

README 同时给出一条重要提示:所有模型家族都包含带预训练权重的变体;部分变体没有权重是刻意为之,并非 bug。实践中可用 list_pretrained 过滤出有可用权重的变体:

import timm
# 只列出名称匹配 resnet50 且带预训练权重的变体
print(timm.list_models('resnet50*', pretrained_only=True))

上述 API 均在 timm/init.py 中顶层导出(create_modellist_modelslist_pretrainedis_modelget_pretrained_cfg 等),无需深入子包即可使用。

4. 模型工厂:create_model 的加载机制

create_model 是贯穿 README "Other" 特性章节的统一入口。其完整实现见 timm/models/_factory.py,要点如下:

  1. 模型名解析(parse_model_name:模型名支持两种来源前缀
    • hf-hub:<repo_id>:从 Hugging Face Hub 读取 config.json + 权重文件(README 2024-12-31 起,所有做过加载期 remapping 的 OpenCLIP/JAX 权重都有独立 Hub 实例,保证该方式可靠);
    • local-dir:<path>:从本地目录读取同样的模型配置与权重(README "May 28, 2025" 新增)。 若名字含 /\\: 却无前缀,工厂会直接抛错提示你显式选择来源,避免静默加载错误的权重。
  2. 预训练标签(tag):形如 vit_base_patch16_224.augreg_in21k_ft_in1k 的点号标签会被 split_model_name_tag 拆分;显式传入的 pretrained_cfg 优先于名字中的 tag。
  3. kwargs 透传None 值会被剔除后再传给模型类构造,因此 drop_ratedrop_path_rateglobal_pool 等通用训练参数可安全地统一传入,不被支持的模型不会报错。
  4. checkpoint 后置加载checkpoint_path 在模型初始化完成之后再载入,适合直接恢复自己的训练。

README "Features / Other" 中提到的通用接口在此统一实现:所有模型都有 get_classifier/reset_classifier 访问器与 forward_features 特征前向;features_only=True 配合 out_indices/output_stride 可从任意模型提取多尺度特征金字塔,创建后通过 .feature_info 查询各特征图的通道数与下采样步幅。

import timm
# 分类头
model = timm.create_model('resnet50.a1_in1k', pretrained=True)
head = model.get_classifier(); head = timm.reset_classifier(model, 100)
# 多尺度特征(如分割/检测骨干用法)
feat_model = timm.create_model('resnet50.a1_in1k', features_only=True,
                               out_indices=(0, 1, 2, 3), output_stride=32)
print(feat_model.feature_info)

5. 优化器生态:注册表驱动的统一工厂

README "Optimizers" 章节列出的优化器(AdaBelief、AdaFactor/BV、AdaHessian、AdamP、Lion、LaProp、LARS、MadGrad、MARS、Muon、NAdamW、NovoGrad、RAdam、RMSpropTF、SGDW、Kron、ADOPT、AdaMuon 等,以及 fused*/bnb*/c 后缀变体)在源码中由 timm/optim/_optim_factory.pyOptimizerRegistry 统一管理:每个优化器注册为一个冻结数据类 OptimInfo,携带 has_epshas_momentumhas_betassecond_order 等元信息,工厂据此自动装配 weight_decay/layer_decay 参数组(见 timm/optim/_param_groups.py)。

使用方式(与 README 指引一致):

import timm
# 查看全部优化器及描述
for name, info in timm.optim.list_optimizers(with_description=True):
    print(name, '-', info)

# 用工厂创建:自动处理权重衰减分组与 layer decay
model = timm.create_model('convnext_base', num_classes=100)
opt = timm.optim.create_optimizer_v2(
    model, 'adamw',            # 或 'muon'、'nadamw'、'sgdw'、'caadamw' 等
    lr=1e-3, weight_decay=0.05,
)

README 特别标注的两个近期行为值得注意:Muon(及其 adamuon/nadamuon 变体)对不适合 NS 正交化的参数形状默认回退 AdamW 更新,并支持 adjust_lr_fn 与自定义 ns_coefficientsc 后缀(如 adamcnadamc)实现 "corrected weight decay"。此外 SGDP、AdamP、Adan 在 README 中被标记了 caution(谨慎使用),选型时应优先验证常用优化器。

学习率调度对应 timm/scheduler/,含 step、带重启的 cosine/tanhplateau 等,README "Other" 一节指出其思想源自 AllenNLP、FAIRseq 与 SGDR。

6. 数据增广与正则化

README "Augmentations" 与 "Regularization" 两节的能力在 timm/data/timm/layers/ 中落地:

python validate.py /imagenet --amp -j 8 \
  --model vit_base_patch16_224 --model-kwargs use_naflex=True \
  --naflex-loader --naflex-max-seq-len 256

训练侧还可用 --naflex-train-seq-lens(每批随机取的目标序列长度)、--model-kwargs enable_patch_interpolator=True --naflex-patch-sizes 12 16 24(每批随机 patch 尺寸+插值)与 --naflex-loss-scale(按序列长度变化的损失/批大小缩放)。

7. 训练、验证、推理脚本

README "Train, Validation, Inference Scripts" 一节指出仓库根目录提供与内置模型配套的高性能参考脚本。结合仓库文件与 README "Other" 中列出的运行模式:

脚本 用途 关键特性
train.py 分类训练 支持 NVIDIA DDP(每进程单卡,可选 AMP)、PyTorch DDP 多卡单进程、单卡单进程;torch.compile、纯 bf16/fp16 训练、蒸馏任务包装(logits/特征/词元蒸馏)、wandb 记录
validate.py 验证评估 与训练脚本共享模型/数据接口,支持 NaFlex 加载器(见上节)
inference.py 单图/目录推理 自定义标签推理、加固后的 pickle 检查点处理
benchmark.py 模型推理基准 产出 results/ 中的 benchmark-* CSV
hubconf.py Torch Hub 入口 globals().update(timm.models._registry._model_entrypoints),使任意模型名可直接作为 torch.hub 入口函数
onnx_export.py / onnx_validate.py ONNX 导出与校验 配合 1.0.2x 持续改进的导出修复
distributed_train.sh 分布式启动 torchrun 风格的 DDP 训练入口
avg_checkpoints.py / clean_checkpoint.py 检查点工具 权重平均(SWA 风格)与检查点清理

README 明确说明这些脚本"可以经少量改造适配其他数据集",其定位是复现 ImageNet 结果的参考实现,而非通用训练框架;项目自带的 train.py main()(第 493 行起)完整覆盖了上述参数的解析与分发。快速上手文档可参考仓库内 hfdocs/quickstart.mdxhfdocs/training_script.mdx

一个最小的单卡训练启动示例(参数名以脚本 --help 为准,此处只演示组合):

python train.py /path/to/imagenet \
  --model convnext_base --amp -b 128 \
  --opt adamw --sched cosine --epochs 100 \
  --drop-path 0.2 --mixup 0.8 --cutmix 1.0 --smoothing 0.1

8. 结果与基准数据的组织方式

README "Results" 指向 results/,其组织逻辑在 results/README.md 中说明得很清楚:

  • 验证精度results-imagenet.csv 为标准 ImageNet-1k 验证集(50k 图);另有 Real Labels(重标注)、ImageNetV2(匹配频次)、ImageNet-Sketch、ImageNet-A(自然对抗)、ImageNet-R(渲染鲁棒性)五个 OOD/鲁棒性测试集,且每个 CSV 附带相对 clean 验证的 top-1/top-5 差值与排名。
  • 推理基准benchmark-infer-*-<torch版本>-<GPU> 命名的 CSV(如 benchmark-infer-amp-nchw-pt291-cu128-4090.csv),覆盖 RTX 3090/4090/5090/RTX Pro 6000 与 FP16/AMP/动态编译等组合;由 results/generate_csv_results.py 生成。
  • 元数据model_metadata-in1k.csv 记录每个预训练权重的预训练数据集与训练技术(蒸馏、SSL、WSL 等)。

README 同时强调:验证分数目前仅对带预训练权重且为 ImageNet-1k 分类头的模型变体统计,基准则对所有模型统计。

9. 许可证边界(选型必知)

README "Licenses" 一节的边界结论直接影响商用选型:

  • 代码:Apache 2.0;第三方代码(MIT/BSD 等宽松许可)已做兼容性审查。
  • 预训练权重:默认假设 ImageNet 数据集的"仅非商业研究"许可约束延续到权重;用于商业产品前作者建议咨询法律意见。
  • 例外清单:Facebook WSL/SSL/SWSL ResNe(Xt) 与 Google Noisy Student EfficientNet 等使用了专有数据预训练,其中 Facebook 系模型有明确的非商业许可(CC-BY-NC 4.0);Google 系表面上仅 Apache 2.0 + ImageNet 顾虑。
  • 从 1.0.21 起,代码中的预训练配置新增了 license 字段,可用 timm.get_pretrained_cfg(model_name) 查询每个权重的许可信息。

10. 小结与引用

timm 的价值在于把"模型选择—权重加载—训练复现—评估基准"收敛到一套统一 API 与可审计的 CSV 结果之下:create_model 一个入口覆盖注册表模型、HF Hub 权重与本地目录权重;优化器/调度器/增广由同一注册表体系装配;训练脚本覆盖从单卡到 DDP 的多种部署形态;results/ 目录保证精度与延迟数据可被程序化比对。引用本项目时请使用 README "Citing" 给出的 BibTeX(rw2019timm,Zenodo DOI: 10.5281/zenodo.4414861)。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
987
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384