微调Huggingface bert-large-uncased-whole-word-masking时报类型错误如何解决
错误原因与解决方案
核心报错根因
你遇到的类型错误直接来自MeditationsDataset类的__len__方法实现错误:
__len__方法要求返回一个整数类型的数据集样本总数,你当前返回的是self.encodings.input_ids,这是一个二维PyTorch张量,无法被转换为单元素整数索引,DataLoader在生成采样索引时就会触发该报错。
另外你的代码还存在3个隐藏问题会导致后续训练报错:
- 你要做的是掩码语言建模(MLM)微调,调用的
BertModel是纯特征提取的基础BERT类,没有MLM头,不会计算loss,调用outputs.loss会报错。 - 优化器命名不一致:定义时命名为
optim,后续训练循环调用时写的是optimizer,会触发名称未定义错误。 __getitem__中对已经是张量的val[idx]额外套了torch.tensor(),属于不必要的重复转换,可能触发张量梯度相关警告。
修复方案
按顺序修改以下代码即可:
- 修复数据集类的
__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)
- 替换模型为带MLM头的BERT类:
# 把导入和模型初始化替换为下面的代码 from transformers import BertForMaskedLM, AdamW model = BertForMaskedLM.from_pretrained("bert-large-uncased-whole-word-masking")
- 统一优化器命名:
要么把优化器定义修改为:
optimizer = AdamW(model.parameters(), lr=1e-5)
要么把训练循环里的优化器调用修改为:
optim.step() optim.zero_grad()
内容的提问来源于stack exchange,提问作者Dina
相关产品推荐
相关产品推荐

