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

微调Huggingface bert-large-uncased-whole-word-masking时报类型错误如何解决

错误原因与解决方案

核心报错根因

你遇到的类型错误直接来自MeditationsDataset类的__len__方法实现错误:

  • __len__方法要求返回一个整数类型的数据集样本总数,你当前返回的是self.encodings.input_ids,这是一个二维PyTorch张量,无法被转换为单元素整数索引,DataLoader在生成采样索引时就会触发该报错。

另外你的代码还存在3个隐藏问题会导致后续训练报错:

  1. 你要做的是掩码语言建模(MLM)微调,调用的BertModel是纯特征提取的基础BERT类,没有MLM头,不会计算loss,调用outputs.loss会报错。
  2. 优化器命名不一致:定义时命名为optim,后续训练循环调用时写的是optimizer,会触发名称未定义错误。
  3. __getitem__中对已经是张量的val[idx]额外套了torch.tensor(),属于不必要的重复转换,可能触发张量梯度相关警告。

修复方案

按顺序修改以下代码即可:

  1. 修复数据集类的__len__方法和__getitem__冗余转换:
class MeditationsDataset(torch.utils.data.Dataset):
    def __init__(self, encodings):
        self.encodings= encodings
    def __getitem__(self, idx):
        return {key: val[idx] for key, val in self.encodings.items()}
    def __len__(self):
        # 返回样本总数,也就是input_ids的第一维长度
        return len(self.encodings.input_ids)
  1. 替换模型为带MLM头的BERT类:
# 把导入和模型初始化替换为下面的代码
from transformers import BertForMaskedLM, AdamW
model = BertForMaskedLM.from_pretrained("bert-large-uncased-whole-word-masking")
  1. 统一优化器命名:
    要么把优化器定义修改为:
optimizer = AdamW(model.parameters(), lr=1e-5)

要么把训练循环里的优化器调用修改为:

optim.step()
optim.zero_grad()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:15:03