DINOv2 预训练模型配置指南:位置编码、输入尺寸与通道适配 3 个坑一次讲清
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
DINOv2 是 Meta 推出的自监督视觉 Transformer 预训练框架,提供 ViT-S/B/L/g 四档在 LVD-142M 上预训练的权重。多数配置问题出在"拿权重的姿势"上,先看一条真实报错:你用img_size=224搭了个模型再加载dinov2_vitb14_pretrain.pth,load_state_dict立刻抛错:
RuntimeError: size mismatch for pos_embed: copying a param with shape torch.Size([1, 1370, 768]) from checkpoint, the shape in current model is torch.Size([1, 197, 768]).下面按"报错现象 → 根因 → 对策"把 1370 与 197 的来龙去脉、位置编码插值、多通道适配一次讲清。
为什么 pos_embed 是 1370 维:518、14 与 1369 的对应关系
结论先行:所有 DINOv2 预训练权重都在 518×518 输入、patch 14 下训练,hub 加载入口的默认参数就是img_size=518, patch_size=14,照默认值构建即可对上。
1370 的算法:518 ÷ 14 = 37,即 37×37 = 1369 个 patch token,再加 1 个 CLS token,得 1370 个 token。ViT-B 的嵌入维度是 768,所以pos_embed形状为 [1, 1370, 768]。而 224×224 只有 16×16 = 256 个 patch,加 CLS 是 257(按 224/patch14 的旧 ViT 习惯则是 196+1=197,取决于 patch 大小),与权重对不上——这就是报错里 1370 vs 197 的由来。
import torch model = torch.hub.load("facebookresearch/dinov2", "dinov2_vitb14") print(model.pos_embed.shape) # torch.Size([1, 1370, 768]) print(model.patch_embed.num_patches) # 1369非 518 输入时位置编码如何插值
现象:改成 224×224 输入后要么直接报错、要么特征质量下滑。原因:权重中的位置编码是按 37×37 网格训的,换尺寸后 token 网格对不上。对策:模型内置 interpolate_pos_encoding 会自动把 patch 位置编码做双三次(bicubic)插值到新网格,前提只有一个——输入边长必须是 patch 大小 14 的整数倍:224、252、448 都合法,225 会崩。带寄存器(registers)的_reg系列还会开启antialias=True并将interpolate_offset从 0.1 置为 0.0,这是加载_reg权重时不能省的两项构建参数。实操建议:显存够就保持 518×518;紧张时用 224×224 走内置插值,不要自己改pos_embed。
多通道细胞图像的通道适配怎么配
现象:4/5 通道的细胞荧光图像喂给in_chans=3的模型,patch 卷积核形状(768×3×14×14)直接不匹配;硬拼回 3 通道则信息有损、下游指标下滑。原因:DINOv2 的patch_embed是固定输入通道数的卷积,权重与通道数一一绑定,不能事后换。对策:本仓库的 ChannelAdaptive-DINO 采用 "bag of channels" 方案——训练配置 里 student 与 teacher 均设in_chans: 1、channel_adaptive: true,每个通道独立走一遍 ViT 再做通道级融合,从结构上绕开通道数绑定问题。评估侧(linear.py)记得带--bag-of-channels参数保持一致。
图:ChannelAdaptive-DINO 的通道自适应架构与在不同形态学原型上的表现对比
细胞数据预训练与线性评估的完整配置
以 HPA-FoV 单细胞数据集预训练 ViT-L/16 为例,官方口径:4 台 A100-80GB 节点共 32 卡,约 2 天训完,教师权重每 12500 步存到eval目录。关键超参(来自上述 yaml):全局裁剪 224(缩放 0.4–1.0)、8 个 96 像素局部裁剪(缩放 0.005–0.4)、momentum_teacher: 0.996、base_lr: 5.0e-4、400 epochs 配 20 轮 warmup、每卡 batch 16。
python dinov2/run/train/train.py \ --nodes 4 \ --config-file dinov2/configs/train/cell_dino/vitl16_boc_hpafov.yaml \ --output-dir <OUT_DIR> \ train.dataset_path="HPAFoV:split=TRAIN:root=<DATA_DIR>:wildcard=SEPARATE_CHANNELS"预训练结束后用教师权重做线性评估,注意--crop-size 384、--n-last-blocks 4与 F1 指标类型:
PYTHONPATH=.:dinov2/data python dinov2/run/eval/cell_dino/linear.py \ --config-file dinov2/configs/eval/cell_dino/vitl16_channel_adaptive_pretrain.yaml \ --pretrained-weights <OUT_DIR>/eval/training_359999/teacher_checkpoint.pth \ --train-dataset "HPAFoV:split=TRAIN:mode=PROTEIN_LOCALIZATION:root=<DATA_DIR>" \ --val-dataset "HPAFoV:split=VAL:mode=PROTEIN_LOCALIZATION:root=<DATA_DIR>" \ --val-metric-type mean_per_class_multilabel_f1 \ --bag-of-channels --crop-size 384 --n-last-blocks 4 --avgpool在 5 个细胞数据集(WTC/HPA/CP)上复现的代表性指标(复现值,来自官方文档):
| 任务 | kNN | 线性探针 |
|---|---|---|
| HPA Task 1(蛋白定位) | 91.6 | 92.7 |
| HPA Task 2 | 61.4 | 87.2 |
| WTC Task 1 | 80.3 | 89.9 |
| CP Task 1 | 89.8 | 89.9 |
图:Cell-DINO 的自蒸馏流程:单细胞图像经全局与局部裁剪视图由教师-学生网络协同学习
常见配置问题速查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
pos_embed1370 vs 197 形状报错 | 按 224 构建模型却加载 518 预训练权重 | 按默认img_size=518, patch_size=14构建 |
| 换输入尺寸后报错或特征变差 | 边长不是 patch 14 的整数倍 | 用 224/252/448 等,交给内置 bicubic 插值 |
| 多通道图像卷积核不匹配 | patch_embed通道数与权重绑定 | in_chans=1+channel_adaptive: true |
_reg权重加载失败 | 模型多了 4 个寄存器 token 未对齐 | 用dinov2_vitb14_reg等入口加载 |
进阶:用寄存器 token 压低注意力伪影
_reg系列权重比标准版多 4 个可学习的 register token(num_register_tokens=4),插在 CLS 之后参与注意力,用于吸收图像高频伪影,使 patch 特征更干净。注意它与标准版权重不通用:_reg必须配合antialias=True, interpolate_offset=0.0构建。做下游微调或取 patch 级特征时优先选_reg权重,特征级任务收益明显;只用 CLS 做分类时两者差距不大。
动作清单:
- 按
img_size=518, patch_size=14构建模型再加载 LVD-142M 权重,别动这两个默认值。 - 显存不足时选 224/252/448(14 的倍数),位置编码交给
interpolate_pos_encoding自动处理。 - 处理 4/5 通道细胞图像:
in_chans=1、channel_adaptive: true,训练与评估两侧参数保持一致。 - 取 patch 级特征优先加载
_reg权重,并保留其antialias=True, interpolate_offset=0.0构建参数。 - 预训练后评估走教师权重(
eval/下每 12500 步一份),线性探针配--crop-size 384 --n-last-blocks 4。
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考