DistilBERT模型训练报错:未返回Loss的原因及解决方法
问题分析与修复方案
问题背景
尝试基于自定义CSV数据集训练文本分类模型,数据集结构如下:
DatasetDict({ train: Dataset({ features: ['Label', 'Title', 'Text'], num_rows: 350 }) test: Dataset({ features: ['Label', 'Title', 'Text'], num_rows: 141 }) })
执行T.train()时触发ValueError,报错:
ValueError: The model did not return a loss from the inputs, only the following keys: logits. For reference, the inputs it received are input_ids,attention_mask.
错误根源
核心原因是模型训练时未接收到标签数据。AutoModelForSequenceClassification只有在输入包含labels参数时,才会自动计算并返回损失;如果没有labels,模型只会输出logits,导致Trainer无法计算损失触发报错。
与官方示例的具体差异
- 标签字段名不匹配:官方示例数据集使用
label(小写)作为标签列名,而你的数据集用的是Label(大写),Trainer默认只会识别labels或label字段作为模型的标签输入。 - Tokenize函数未传递标签:官方示例的tokenize逻辑会保留标签字段,你的代码仅处理了文本输入,未将
Label字段映射为模型需要的labels参数。 - 计算指标函数存在拼写错误:函数参数定义为
evel,但内部使用了未定义的eval变量,后续会引发新的错误。 - 缺失numpy依赖导入:
ComputeMetrics中使用np.argmax但未导入numpy库。
修复步骤
1. 修正Tokenize函数,传递标签数据
修改TokenizeData函数,将数据集的Label字段重命名为模型期望的labels:
def TokenizeData(Data): # 处理Title文本 tokenized_output = Tokenizer(Data["Title"], truncation=True) # 将Label字段映射为模型需要的labels参数 tokenized_output["labels"] = Data["Label"] return tokenized_output
2. 修复计算指标函数的问题
添加numpy导入,并修正参数名避免冲突:
# 在代码开头新增numpy导入 import numpy as np def ComputeMetrics(eval_pred): Predictions, Labels = eval_pred Predictions = np.argmax(Predictions, axis=1) return accuracy.compute(predictions=Predictions, references=Labels)
3. (可选)结合Title和Text字段训练
如果任务需要同时使用标题和文本内容,修改Tokenize函数合并两个字段:
def TokenizeData(Data): # 合并Title与Text作为模型输入文本 combined_texts = [f"{title} {text}" for title, text in zip(Data["Title"], Data["Text"])] tokenized_output = Tokenizer(combined_texts, truncation=True) tokenized_output["labels"] = Data["Label"] return tokenized_output
4. 验证数据集字段
运行以下代码确认处理后的数据集包含labels字段:
print(TokenizedData["train"].features)
输出应包含labels字段,确保模型训练时能正确获取标签。
内容的提问来源于stack exchange,提问作者An Assembler
相关产品推荐
相关产品推荐

