You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dinov2ForImageClassification标签数量异常,无法实现ImageNet 1000分类

Dinov2ForImageClassification返回2分类而非ImageNet 1000分类的解决方案

问题原因

facebook/dinov2-base是无监督预训练的特征提取模型,本身没有附带ImageNet 1000分类任务的分类头(classifier层)。当你用Dinov2ForImageClassification加载该模型时,Transformers库会自动初始化一个新的分类头——如果未明确指定num_labels,默认会创建适配2分类的结构,这就是你得到形状为torch.Size([1, 2])的logits的原因。错误提示里的“分类头权重未从 checkpoint 初始化”也印证了这一点:新的分类头是随机初始化的,必须经过下游任务训练才能生成有效预测。

解决方案

有两种可行方案,根据你的需求选择:

方案一:直接使用ImageNet微调好的预训练模型

官方已在Hugging Face Hub上提供了完成ImageNet 1000数据集微调的Dinov2分类模型,这类模型自带1000类的分类头,可直接用于推理:

from transformers import AutoImageProcessor, Dinov2ForImageClassification
import torch
from datasets import load_dataset

# 加载示例图片
dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

# 加载微调后的ImageNet分类模型
image_processor = AutoImageProcessor.from_pretrained("facebook/dinov2-base-finetuned-imagenet")
model = Dinov2ForImageClassification.from_pretrained("facebook/dinov2-base-finetuned-imagenet")

# 处理输入并推理
inputs = image_processor(image, return_tensors="pt")
with torch.no_grad():
    logits = model(**inputs).logits

# 输出结果:logits形状为[1, 1000]
predicted_label_idx = logits.argmax(-1).item()
predicted_label = model.config.id2label[predicted_label_idx]
print(f"预测标签:{predicted_label}")

方案二:手动指定分类头维度,自行微调

如果你需要基于基础模型自定义训练流程,可在加载模型时明确指定num_labels=1000,让库初始化适配ImageNet 1000分类的分类头,之后用ImageNet数据集完成训练:

from transformers import AutoImageProcessor, Dinov2ForImageClassification
import torch
from datasets import load_dataset

# 加载示例图片
dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

# 加载基础模型时指定1000分类的头
image_processor = AutoImageProcessor.from_pretrained("facebook/dinov2-base")
model = Dinov2ForImageClassification.from_pretrained("facebook/dinov2-base", num_labels=1000)

# 处理输入(此时分类头权重随机,需训练后才能得到有效预测)
inputs = image_processor(image, return_tensors="pt")
with torch.no_grad():
    logits = model(**inputs).logits

# logits形状为[1, 1000]
predicted_label_idx = logits.argmax(-1).item()

注意:方案二中的分类头是随机初始化的,直接推理会得到无意义的结果,必须完成ImageNet数据集的微调训练后才能用于实际预测。

内容的提问来源于stack exchange,提问作者Ofir Shifman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:22:41