ViT 微调准确率掉到 72%?timm 三组参数拉回 90%
【免费下载链接】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
换了个自己的数据集,预训练 ViT 的准确率从 95% 直接砸到 72%。其实多半不是模型不行,是微调参数没配对。用 timm(pytorch-image-models)调好三组参数,就能回到 90% 档位。
微调到底在干嘛?一句话:拨弦,不是换琴
微调不是重训。预训练权重早就"看过"海量图像,相当于老厨师换了个厨房——刀工不用学,只需适应新灶台。你只是换掉分类头,再让新数据把参数"洗"一遍,把通用能力掰向你自己的任务。
🧪 从零到能跑:环境与数据管道
先装好依赖,拉代码:
git clone https://gitcode.com/GitHub_Trending/py/pytorch-image-models cd pytorch-image-models && pip install -r requirements.txt数据侧用 timm 的两个工厂函数就够了:
from timm.data import create_dataset, create_loader dataset = create_dataset(root='data/train', split='train') loader = create_loader(dataset, input_size=224, batch_size=32, is_training=True)is_training=True会自动带上随机裁剪和水平翻转,验证时设成 False 即可。
⚙️ 三组参数,决定你的微调上限
🎯 值得拨的就三组旋钮:学习率、正则化、增强。
ViT 微调学习率设置:5e-5 起步就够了
预训练权重是被"打磨"过的,学习率一大,味道立刻被冲掉。AdamW 配 5e-5 起步,收敛太慢再升到 1e-4,再高基本就翻车。
optimizer = create_optimizer_v2(model, opt='adamw', lr=5e-5, weight_decay=0.05)过拟合解决方案:三件套一起上
三个开关默认都是关的,得手动开:DropPath 防深层网络过拟合,权重衰减压参数幅度,标签平滑防止模型"过度自信"。
model = timm.create_model('vit_base_patch16_224', pretrained=True, drop_path_rate=0.1) # 数据少时提到 0.2 criterion = LabelSmoothingCrossEntropy(smoothing=0.1)配合上面weight_decay=0.05,一整套就齐了。
数据增强策略:一行 RandAugment 打底
别自己堆增强,直接用社区验证过的 RandAugment 配置串:
transform = create_transform( input_size=224, is_training=True, auto_augment='rand-m9-mstd0.5-inc1', # 强度中档的 RandAugment re_prob=0.25) # 随机擦除,额外正则re_prob=0.25的随机擦除相当于"打码",逼模型别看局部纹理,泛化更稳。
进阶:让模型"稳"一点
🪄 这部分是锦上添花。模型 EMA(指数移动平均)是给主模型配一个影子分身,每步都往主模型身上"蹭"一点权重,更新更平滑。验证时用影子模型打分,通常比主模型更稳:
from timm.utils import ModelEmaV3 ema = ModelEmaV3(model, decay=0.9998) # 每个 batch 末尾调用:ema.update(model)推理端想提速,两招任选:包一层torch.cuda.amp.autocast()开混合精度,或model = torch.compile(model)让图编译器干活。精度几乎无损,速度能快一截。
📊 微调效果怎么验收?一张表说清
| 验收点 | 健康范围 | 出问题了怎么办 |
|---|---|---|
| 训练/验证精度 gap | < 3% | 正则加量,学习率减半 |
| EMA 与非 EMA 精度差 | EMA 高 0~1% | 延长训练或换 decay |
| 收敛轮数 | 10 epoch 内进平台期 | 换一档学习率重跑 |
| 单 epoch 精度跳变 | < 1% | 补 warmup 轮数 |
| loss 曲线形态 | 平滑下降无尖峰 | 查数据归一化 |
🚨 踩坑速查
- loss 变 NaN→ 学习率或权重衰减太大 → 先回 5e-5,再逐项调
- 验证精度忽上忽下→ 缺 warmup 或没用 EMA 验证 → 加 3~5 个 epoch 预热
- 推理慢得离谱→ 还在全精度裸跑 → 上 autocast 或 torch.compile
三组旋钮拧到位,准确率自然往上走。下一步可以试vit_large_patch16_224或知识蒸馏再挤一挤。
本文基于 timm 1.0.29.dev0(timm/models/vision_transformer.py、timm/utils/model_ema.py)。
【免费下载链接】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),仅供参考