timm(PyTorch Image Models)权威指南:模型库、训练脚本、优化器生态与预训练权重体系全解析
【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 & V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models
本文基于 README.md 梳理 timm(PyTorch Image Models)的项目定位、模型家族矩阵、优化器/数据增强/正则化生态,以及训练、验证、推理脚本的用法;结合仓库源码中的模型工厂、优化器注册表与结果目录,帮助读者掌握"如何选模型、如何加载权重、如何跑通训练与验证"的完整技术链路,并理解各配置项背后的实现机制。
1. 项目定位:什么是 timm
README 对项目的定义是:
PyTorchImageModels(
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.pymain()(第 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.18. 结果与基准数据的组织方式
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)。
【免费下载链接】pytorch-image-modelsThe largest collection of PyTorch image encoders / backbones. Including train, eval, inference, export scripts, and pretrained weights -- ResNet, ResNeXT, EfficientNet, NFNet, Vision Transformer (ViT), MobileNetV4, MobileNet-V3 & V2, RegNet, DPN, CSPNet, Swin Transformer, MaxViT, CoAtNet, ConvNeXt, and more项目地址: https://gitcode.com/GitHub_Trending/py/pytorch-image-models
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考