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

Transformers库BertForSequenceClassification多分类任务尺寸不匹配问题

问题根因

你遇到的报错确实是两个场景下标签数量不一致导致的:你微调时训练的是59分类任务,因此模型最后一层分类头的权重维度为[59, 1024];当前你初始化模型时传入的num_labels=105,生成的分类头维度为[105, 1024],两者维度不匹配所以加载失败。

你设置的ignore_mismatched_sizes=True没有生效,是因为这个参数仅对from_pretrained方法加载权重的过程生效,而你是在初始化模型后,单独调用load_state_dict加载本地微调权重,这个参数无法作用于load_state_dict的逻辑。

解决方案

根据你的实际测试需求,选择对应方案即可:

  • 场景1:你要测试的仍是原有59类的分类任务
    你新数据集统计得到的105类包含了原训练集没有的标签,本身你的模型也没学习过这些新增类别的特征,也无法给出正确预测。你需要把训练阶段使用的标签字典label_dict保存下来,测试时直接复用训练时的标签字典,此时len(label_dict)=59,初始化的模型分类头维度和微调权重匹配,直接加载就不会报错。你可以选择过滤新数据集中不属于原有59类的样本,或者单独标记这些样本为未知类。

  • 场景2:你需要适配新数据集的105类分类任务
    你只需要复用之前微调好的BERT主干权重,忽略维度不匹配的分类头参数即可,在load_state_dict调用时添加strict=False参数:

    model.load_state_dict(torch.load('finetuned_BERT_epoch_2_full-Copy1.model', map_location=torch.device('cuda')), strict=False)
    

    这种情况下分类头是随机初始化的,如果你要得到可用的预测结果,需要先在新数据集上微调训练分类头,直接预测的结果没有意义。

    如果你之前微调完模型是用model.save_pretrained()的方式保存的,也可以直接加载你自己的微调模型目录,此时ignore_mismatched_sizes参数会生效:

    model = BertForSequenceClassification.from_pretrained("你的微调模型保存目录", num_labels=105, ignore_mismatched_sizes=True)
    
额外注意事项

你贴出的代码里有一行存在报错风险的冗余代码:model = model.to(device)写在模型初始化之前,此时model还没有被定义,运行时会触发报错,直接删掉这行即可。

内容的提问来源于stack exchange,提问作者Guilherme Giuliano Nicolau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:06:02