DistilBert隐喻检测序列分类模型训练报错:未返回loss仅输出logits
问题分析
报错核心原因是训练数据未传入模型所需的labels字段,AutoModelForSequenceClassification仅在输入包含labels时才会自动计算交叉熵损失并返回loss值;若缺少标签,模型只会输出logits,无法完成损失计算。此外,原始数据集加载方式未正确拆分标签与句子文本,是导致问题的根本原因。
修复步骤
1. 正确拆分数据集的标签与文本
原始数据集每行格式为编号 类型 标签 句子,需拆分出label(M/N)和text(句子内容):
def parse_line(line): parts = line.strip().split(maxsplit=3) # 按空格拆分,最多拆3次,保留句子内空格 if len(parts) < 4: return {"text": "", "label": ""} _, _, label, text = parts # 将M/N转为数值标签:M=1,N=0(可按需调整) return {"text": text, "label": 1 if label == "M" else 0} # 加载数据集并解析每一行 dataset = load_dataset('text', data_files='/content/drive/MyDrive/project/metaphors_dataset.txt') dataset = dataset["train"].map(parse_line) # 拆分训练/验证/测试集(保留原逻辑) train_testvalid = dataset.train_test_split(test_size=0.1) test_valid = train_testvalid['test'].train_test_split(test_size=0.5) train_test_valid_dataset = DatasetDict({ 'train': train_testvalid['train'], 'test': test_valid['test'], 'valid': test_valid['train']})
2. 更新预处理函数,保留标签字段
预处理时需将标签保留,避免被过滤:
def preprocess_function(examples): tokenized = tokenizer(examples["text"], truncation=True) # 保留标签字段 tokenized["labels"] = examples["label"] return tokenized tokenized_train = train_test_valid_dataset["train"].map(preprocess_function, batched=True) tokenized_test = train_test_valid_dataset["test"].map(preprocess_function, batched=True)
3. 修正DataCollator定义
确保data_collator正确处理标签,使用DataCollatorWithPadding(需提前导入):
from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
4. 验证模型加载(可选)
若之前的掩码微调模型是PyTorch格式,无需from_tf=True;若为TensorFlow导出模型则保留该参数:
# PyTorch权重格式时,去掉from_tf=True model = AutoModelForSequenceClassification.from_pretrained(path_model, num_labels=2)
最终验证
完成上述修改后,trainer.train()时输入数据会包含input_ids、attention_mask和labels,模型会自动计算损失并返回,训练即可正常启动。
内容的提问来源于stack exchange,提问作者Cristi Fernandez
相关产品推荐
相关产品推荐

