如何在测试集上测试已训练好的HuggingFace多选QA模型
HuggingFace多选问答模型测试集运行方案
你的测试集已经完成和训练集、验证集完全一致的特征处理,字段对齐,不需要额外做预处理,直接复用训练时的组件就能完成测试,两种常用实现方式如下:
方案一:复用Trainer接口(最简便,和训练验证逻辑完全统一)
不需要重写指标计算、数据加载逻辑,直接替换评估数据集即可:
from transformers import TrainingArguments, Trainer, DataCollatorForMultipleChoice, AutoModelForMultipleChoice # 加载训练好的模型检查点 model = AutoModelForMultipleChoice.from_pretrained('results/checkpoint-1000') # 配置测试专用参数,关闭训练逻辑 test_args = TrainingArguments( output_dir="./test_results", per_device_eval_batch_size=8, do_train=False, evaluation_strategy="no" ) # 初始化测试用Trainer,评估数据集替换为test拆分 trainer = Trainer( model=model, args=test_args, tokenizer=tokenizer, data_collator=DataCollatorForMultipleChoice(tokenizer=tokenizer), compute_metrics=compute_metrics, # 直接复用训练阶段写好的指标计算函数 eval_dataset=tokenized_qa["test"] ) # 执行评估,直接返回测试集整体指标 test_metrics = trainer.evaluate() print("测试集指标:", test_metrics)
如果需要导出每条样本的预测结果,开启predict模式即可:
# 修改参数开启预测 test_args.do_predict = True pred_result = trainer.predict(tokenized_qa["test"]) # pred_result.metrics 为整体评估指标 # pred_result.predictions 为所有样本对应4个选项的原始logits,沿最后一维argmax即可得到预测标签 # pred_result.label_ids 为测试集真实标签
方案二:自定义推理循环(适合需要定制化处理预测结果的场景)
如果需要在推理过程中插入自定义逻辑,可以手动构造DataLoader实现:
import torch from torch.utils.data import DataLoader from transformers import DataCollatorForMultipleChoice # 模型切换到评估模式,加载到对应运算设备 device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) model.eval() # 构造测试集DataLoader,collate_fn和训练阶段保持一致 test_dataloader = DataLoader( # 移除非张量类型的原始文本字段,避免数据加载报错 tokenized_qa["test"].remove_columns(['id', 'sent1', 'sent2', 'ending0', 'ending1', 'ending2', 'ending3']), batch_size=8, collate_fn=DataCollatorForMultipleChoice(tokenizer=tokenizer) ) all_preds = [] all_labels = [] # 关闭梯度计算,减少显存占用 with torch.no_grad(): for batch in test_dataloader: batch = {k: v.to(device) for k, v in batch.items()} outputs = model(**batch) batch_preds = outputs.logits.argmax(dim=-1) all_preds.extend(batch_preds.cpu().numpy().tolist()) all_labels.extend(batch["labels"].cpu().numpy().tolist()) # 将all_preds、all_labels传入你训练时用的compute_metrics函数即可得到测试集指标
注意点
- 不要修改tokenizer、data_collator、compute_metrics的配置,和训练阶段保持一致即可,避免特征处理不匹配导致结果异常
- 如果你的测试集没有真实标签(如竞赛提交场景),去掉compute_metrics配置,直接取预测结果整理成要求的提交格式即可
- 手动推理时必须将模型切换到
eval()模式,否则Dropout、BatchNorm等层的训练态行为会导致推理结果不稳定
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

