使用Transformers的Trainer API预训练BERT时出现ValueError如何解决
核心问题梳理
你当前的代码存在两个关键错误,直接触发报错以及后续训练逻辑错误:
- 分词函数参数传递错误:HuggingFace分词器的第二个入参是配对文本(做句对任务时才需要传入),你误将
Sentiment列的整型标签作为第二个参数传入分词器,分词器要求输入必须为字符串类,因此抛出类型错误。 - 模型选型不匹配:你使用的
BertForMaskedLM是掩码语言预训练任务专用的模型头,不支持二分类任务,需要替换为序列分类专用的模型头。
完整修正方案
1. 替换正确的分类模型
加载模型时指定分类数量为2,适配你的二分类情感分析需求:
model = transformers.BertForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2)
2. 修改分词逻辑
仅将文本列传入分词器,单独处理标签字段匹配模型输入要求:
def tokenize_function(examples): # 仅传入待分类的文本内容做分词 tokenized_output = tokenizer( examples["Text"], truncation=True, padding="max_length", max_length=128 # 可根据你的文本长度调整 ) # 新增label字段,对应分类模型要求的标签输入 tokenized_output["label"] = examples["Sentiment"] return tokenized_output
3. 优化数据集拆分与Trainer配置
拆分训练验证集,避免过拟合,同时正确传入数据集:
# 分词处理 tokenized_datasets = dataset.map(tokenize_function, batched=True) # 拆分10%数据作为验证集 split_data = tokenized_datasets["train"].train_test_split(test_size=0.1, seed=42) # 初始化Trainer时分别传入训练、验证集 trainer = Trainer( model=model, args=training_args, train_dataset=split_data["train"], eval_dataset=split_data["test"] )
内容的提问来源于stack exchange,提问作者Mr. Engineer
相关产品推荐
相关产品推荐

