
pytorch-image-models 实用指南ViT 微调突破 90% 精度瓶颈的 3 类关键参数【免费下载链接】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用 pytorch-image-modelstimm做 ViT 微调时精度常卡在 90% 上下学习率偏高导致震荡、数据偏少引发过拟合、缺正则使泛化吃紧。本文按先诊断、后调参的路径讲清 ViT 微调中 ViT 学习率怎么设、正则化与数据增强如何搭配并给出一份可执行的避坑清单。一、先诊断ViT 微调卡在 90% 的三类原因 调参之前建议先判断你属于哪种情况因为三者的解法完全不同1. 训练震荡验证集忽高忽低典型现象是 loss 前几个 epoch 快速下降后开始反复横跳甚至回升。多半是学习率对 Transformer 来说偏大——ViT 的参数更新方向比 CNN 更敏感学习率一高注意力权重就会被打散。对应的处理是调低学习率并加预热warmup而不是急着改模型结构。2. 过拟合训练 99%验证 90%训练精度几乎打满而验证精度停滞说明模型在背数据。此时增加正则DropPath、随机擦除、标签平滑、EMA比扩大模型更有效。3. 小数据量下欠拟合又过拟合并存自定义数据集只有几百到几千张时两类问题会同时出现。需要保守学习率 分层学习率衰减 强增强组合使用单独调任何一项都收效有限。二、模型初始化与数据加载的正确姿势1. 加载预训练权重的两个正则开关模型定义见 timm/models/vision_transformer.py。创建模型时除了类别数建议同时打开两个正则参数drop_rate输出前全连接处的 Dropout和drop_path_rate随机深度训练时按深度递增地整块丢弃残差路径。drop_path_rate从 0.1 起步过拟合明显时提到 0.2是 ViT 微调性价比最高的一项。import timm model timm.create_model( vit_base_patch16_224, # 换其他变体只改名字 pretrainedTrue, num_classes50, # 你的自定义类别数 drop_rate0.1, # 分类头前的 Dropout drop_path_rate0.1, # 随机深度过拟合时提到 0.2 )2. 数据管线对齐预训练设置自定义目录用create_dataset加create_loader即可注意两点验证集加载时关闭is_training这样验证侧只做缩放裁剪不做增强和水平翻转加载器默认使用 ImageNet 的均值/标准差做归一化训练、验证、推理三处必须一致。from timm.data import create_dataset, create_loader train_ds create_dataset(name, rootpath/to/data, splittrain) loader create_loader( train_ds, input_size(3, 224, 224), # 224 与 patch16 对齐 batch_size64, is_trainingTrue, # 训练侧自动挂增强管线 re_num1, # 随机擦除次数见下节 )三、训练超参ViT 学习率怎么设、调度怎么选 ⚙️1. 优化器AdamW 参数组自动分组推荐 AdamW起点学习率 5e-5权重衰减 0.05。用 timm 的create_optimizer_v2而不是原生torch.optim.AdamW的好处是它会自动把 bias 和一层参数norm/bias排除在权重衰减之外这个细节对 Transformer 的收敛速度影响不小另外它还内置layer_decay分层学习率衰减后面小数据量场景会用到。from timm.optim import create_optimizer_v2 optimizer create_optimizer_v2( model, optadamw, lr5e-5, # 批大小变化时按线性比例缩放 weight_decay0.05, # 自动对 bias/norm 层豁免 )2. 调度余弦衰减 预热两个不能少调度器工厂在 timm/scheduler/scheduler_factory.py。微调场景固定选cosine理由有三无需手动设衰减节点min_lr保证训练末期仍有非零学习率收尾配合warmup_epochs平滑前几个 epoch直接缓解上面第 1 类的震荡问题。预热学习率 1e-6 级别即可预热轮数占总轮数 10%~20%如 30 轮取 3~5 轮。from timm.scheduler import create_scheduler_v2 scheduler, epochs create_scheduler_v2( optimizer, schedcosine, num_epochs30, warmup_epochs3, # 预热 3 轮 min_lr1e-6, # 末期地板学习率 warmup_lr1e-6, # 预热起点 )注意调用时机scheduler.step()每个 epoch 结束后调用一次默认按 epoch 步进而不是每个 batch 调一次若按 batch 步进需传step_on_epochsFalse并给updates_per_epoch。四、正则化组合拳timm 数据增强、标签平滑与 EMA单项正则的提升都有限组合起来才明显。推荐按增强 → 标签平滑 → EMA三层叠加每层独立可开关方便你定位哪一层有效。1. 数据增强RandAugment 随机擦除用create_transform自定义管线。两个经验值随机擦除概率re_prob0.25是多数 ImageNet 系训练验证过的甜点位插值方式bicubic要与预训练阶段一致。rand-m9-mstd0.5-inc1这种策略名可直接套用它是 RandAugment 的常见强配置。from timm.data import create_transform tf create_transform( input_size(3, 224, 224), auto_augmentrand-m9-mstd0.5-inc1, # RandAugment 强增强 color_jitter0.4, re_prob0.25, # 随机擦除概率 re_modepixel, interpolationbicubic, )2. 标签平滑与模型 EMA标签平滑防止模型对每张图过于自信smoothing0.1是默认安全值from timm.loss import LabelSmoothingCrossEntropy from timm.utils import ModelEmaV3 criterion LabelSmoothingCrossEntropy(smoothing0.1) # EMA 影子模型decay 0.9998 起用 ema ModelEmaV3(model, decay0.9998, use_warmupTrue)EMA 使用要点每步optimizer.step()后调ema.update(model)更新的是影子模型不碰原模型保存权重和验证评估都用ema.module——很多人精度上不去的隐形原因就是最后存了原始权重训练步数少于 1 万步时建议开use_warmupTrue衰减率从 0 逐渐升到目标值避免早期 EMA 被初始化噪声拉偏。五、训练落地与评估闭环完整参考实现是仓库根目录的 train.py它把上面所有环节优化器分组、调度步进、EMA、混合精度--amp、梯度裁剪--clip-grad都接好了你既可以照它的默认值起步也可以只借鉴单段。评估闭环建议这样做每个 epoch 用 EMA 权重跑一遍验证记录 top-1 与 loss训练收敛后用仓库自带的validate.py脚本对最终权重独立复测排除训练循环里的状态残留对比原始权重 vs EMA 权重两次验证分数若 EMA 更高但差距超过 1 个点先检查ema.update的调用位置是否正确再考虑调大 decay。推理阶段如需提速可开混合精度推理或在 PyTorch 2.x 上用torch.compile包一层二者对 ViT 的加速收益都比较稳定。六、避坑清单微调过拟合怎么办按这个顺序排查 ️按优先级从高到低逐项排查通常前两项就能解决大部分问题先降学习率从 5e-5 降到 3e-5 并确认预热生效震荡和过拟合会同时缓解加随机深度drop_path_rate从 0.1 提到 0.2这是 ViT 特有的过拟合开关开分层衰减小数据集几千张以内给create_optimizer_v2传layer_decay0.85让浅层 Transformer 块以更小学习率更新保留更多预训练特征上 EMA 并只存 EMA 权重确认验证用的影子模型而不是原始模型梯度裁剪兜底仍不稳定时按 train.py 的方式开--clip-grad 1.0同时核对数据归一化是否与 ImageNet 均值/标准差一致。下一步清单用validate.py对当前权重独立复测一次确认精度数字可复现数据集小于 5 千张时追加layer_decay0.85重训一轮做 A/B 对比验证ema.module与原始权重的验证分差是否小于 1 个点否则检查ema.update位置达标后跑一遍 ONNX 导出脚本仓库根目录onnx_export.py确认部署侧精度一致想要更大提升时把模型升级到vit_large_patch16_224并保持其余超参不变先验证容量是否还是瓶颈。【免费下载链接】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),仅供参考