timm(PyTorch Image Models)权威指南:模型库、训练脚本、优化器生态与预训练权重体系全解析
本文基于 README.md 梳理 timm(PyTorch Image Models)的项目定位、模型家族矩阵、优化器/数据增强/正则化生态,以及训练、验证、推理脚本的用法;结合仓库源码中的模型工厂、优化器注册表与结果目录,帮助读者掌握"如何选模型、如何加载权重、如何跑通训练与验证"的完整技术链路,并理解各配置项背后的实现机制。
1. 项目定位:什么是 timm
README 对项目的定义是:
PyTorch Image Models(
timm)是一个图像模型、层、工具函数、优化器、调度器、数据加载器/增广,以及参考训练/验证脚本的集合,目标是汇聚各类 SOTA 模型,并具备复现 ImageNet 训练结果的能力。
从仓库结构看,timm 并非单一模型仓库,而是一个"模型 + 训练基础设施"平台:
| 组成部分 | 对应路径 | 说明 |
|---|---|---|
| 模型定义 | timm/models/ | 100+ 架构家族,每个家族一个模块文件(如 resnet.py、vision_transformer.py、swin_transformer.py、convnext.py) |
| 通用层库 | timm/layers/ | 卷积/归一化/激活工厂、注意力模块、DropPath/DropBlock、模糊池化等 |
| 优化器 | timm/optim/ | 30 余种优化器实现与统一工厂 |
| 学习率调度 | timm/scheduler/ | step、cosine(含重启)、tanh(含重启)、plateau 等 |
| 数据与增广 | timm/data/ | 数据集工厂、Mixup/CutMix/AutoAugment/RandAugment、NaFlex 变长管线 |
| 参考脚本 | train.py、validate.py、inference.py、benchmark.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.py、resnetv2.py | Vision Transformer(ViT、AugReg、SBB 等) | timm/models/vision_transformer.py |
| ResNeSt / Res2Net / ResMLP | resnest.py、res2net.py | Swin Transformer / V2 | swin_transformer.py、swin_transformer_v2.py |
| SENet 家族(SE/ECAResNet/SK) | senet.py、sknet.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.py、mobilenetv5.py | NaFlexViT(NaViT/FlexiViT/SigLIP-2) | naflexvit.py |
| RegNet / ReXNet / RepVGG | regnet.py、rexnet.py | MixNet / MNASNet / NASNet | mixnet(MBConv 家族统一实现) |
| DenseNet / DLA / DPN / VoVNet | densenet.py、dla.py、dpn.py、vovnet.py | CSPNet(ResNet/ResNeXT) | cspnet.py |
| Inception 家族 | inception_v3.py、inception_v4.py | 高效 CNN(EdgeNeXt、FasterNet、GhostNet、LCNetV2) | edgenext.py、fasternet.py、ghostnet.py、lcnetv2.py |
README 同时给出一条重要提示:所有模型家族都包含带预训练权重的变体;部分变体没有权重是刻意为之,并非 bug。实践中可用 list_pretrained 过滤出有可用权重的变体:
import timm
# 只列出名称匹配 resnet50 且带预训练权重的变体
print(timm.list_models('resnet50*', pretrained_only=True))
上述 API 均在 timm/init.py 中顶层导出(create_model、list_models、list_pretrained、is_model、get_pretrained_cfg 等),无需深入子包即可使用。
4. 模型工厂:create_model 的加载机制
create_model 是贯穿 README "Other" 特性章节的统一入口。其完整实现见 timm/models/_factory.py,要点如下:
- 模型名解析(
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" 新增)。 若名字含/、\\、:却无前缀,工厂会直接抛错提示你显式选择来源,避免静默加载错误的权重。
- 预训练标签(tag):形如
vit_base_patch16_224.augreg_in21k_ft_in1k的点号标签会被split_model_name_tag拆分;显式传入的pretrained_cfg优先于名字中的 tag。 - kwargs 透传:
None值会被剔除后再传给模型类构造,因此drop_rate、drop_path_rate、global_pool等通用训练参数可安全地统一传入,不被支持的模型不会报错。 - 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.py 的 OptimizerRegistry 统一管理:每个优化器注册为一个冻结数据类 OptimInfo,携带 has_eps、has_momentum、has_betas、second_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_coefficients;c 后缀(如 adamc、nadamc)实现 "corrected weight decay"。此外 SGDP、AdamP、Adan 在 README 中被标记了 caution(谨慎使用),选型时应优先验证常用优化器。
学习率调度对应 timm/scheduler/,含 step、带重启的 cosine/tanh、plateau 等,README "Other" 一节指出其思想源自 AllenNLP、FAIRseq 与 SGDR。
6. 数据增广与正则化
README "Augmentations" 与 "Regularization" 两节的能力在 timm/data/ 与 timm/layers/ 中落地:
- 增广:Mixup(timm/data/mixup.py)、CutMix、AutoAugment / RandAugment(配置对齐 EfficientNet 官方训练)、AugMix(含 JSD 损失,见 timm/loss/jsd.py)、SplitBatchNorm(timm/layers/split_batchnorm.py,将 BN 在干净与增广数据间拆分)。
- 正则化:DropPath/Stochastic Depth 与 DropBlock(timm/layers/drop.py)、Blur Pooling(timm/layers/blur_pool.py)。
- NaFlex 管线:README 记载
train.py/validate.py加--naflex-loader即可用变长宽比/分辨率训练 NaFlexViT;相关实现位于 timm/data/naflex_dataset.py、naflex_loader.py 与 timm/data/naflex_mixup.py。README 给出的典型验证命令:
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.mdx 与 hfdocs/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)。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00