Evaluate 怎样加载指标并处理批量预测
我第一次把模型预测接入 Evaluate 时,真正卡住的不是指标公式,而是“这一批结果到底什么时候交给指标对象”。如果数据很小,可以直接调用 compute();如果预测来自循环中的多个 batch,更稳妥的做法是先用 evaluate.load() 加载指标,再逐批调用 add_batch(),最后统一 compute()。
官方地址:https://huggingface.co/docs/evaluate/
把 Evaluate 想成一个带输入契约的指标容器:先确认它要接收哪些字段,再让每个预测批次和对应标签一起进入,所有批次完成后只计算一次。
先确认指标需要什么输入
Evaluate 的指标不是一个只接收任意两个列表的黑盒。加载后先看 features,可以确认字段名以及单个元素的形状。以分类准确率为例,最常见的字段就是 predictions 和 references。

import evaluate
# 先加载指标,再查看它声明的输入字段;字段名要和后续调用保持一致。
accuracy = evaluate.load("accuracy")
print(accuracy.features)
# 这里的 features 通常会说明 predictions 和 references 的数据类型。
这一步很适合排除“参数名写错”的问题。模型输出可能叫 logits、labels 或别的名字,但传给指标时仍要转换成该指标认识的 predictions 与 references。Evaluate 接受列表、NumPy 数组和部分张量格式,但输入语义不会因此改变。
用 evaluate.load 加载指标对象
最小加载方式是 evaluate.load("accuracy")。返回的对象同时提供一次性计算与增量提交接口。若名称存在歧义,还可以显式传入 module_type,但普通分类指标通常不需要额外参数。
import evaluate
# accuracy 是指标标识;返回对象后面会负责接收预测值和参考值。
metric = evaluate.load("accuracy")
# 小数据可以直接把完整数组交给 compute;关键字参数避免顺序传错。
result = metric.compute(
predictions=[1, 0, 0, 1],
references=[1, 1, 0, 1],
)
print(result)
结果是一个字典,而不是裸浮点数。官方示例展示的形式是 {'accuracy': 0.5},真实值取决于你的预测和标签。保留字典结构有一个好处:后续换成返回多个字段的指标时,调用方不必重新设计结果处理。
预测按批次到达时,用 add_batch 累积
实际推理经常是“拿一批输入、跑一批模型、得到一批预测”。这时没有必要为了调用一次 compute(),再把全部预测和标签复制到一个超大的列表里。每次得到一个 batch,就同时提交预测值和参考值。
import evaluate
metric = evaluate.load("accuracy")
# 每个元组代表一个已经完成推理的批次;两边必须一一对应。
batch_results = [
([0, 1], [0, 0]),
([1, 0], [1, 0]),
]
for references, predictions in batch_results:
# 只提交当前批次,Evaluate 会把数据放入指标对象的累计输入中。
metric.add_batch(
references=references,
predictions=predictions,
)
# 所有批次都提交后再计算,避免漏掉最后一个 batch。
result = metric.compute()
print(result)

这里最容易出现的错误是把参数方向写反,或者让一个 batch 的预测数量与参考值数量不一致。工程上可以在提交前做轻量的长度检查;检查失败时尽早报错,比等到最终指标阶段才发现样本错位更容易定位。
def add_checked_batch(metric, predictions, references):
# 先检查当前批次的样本数,防止预测与标签错位后继续累计。
if len(predictions) != len(references):
raise ValueError("predictions 和 references 的长度必须一致")
# 通过关键字传参,让字段含义清楚,也便于后续替换输入容器。
metric.add_batch(
predictions=predictions,
references=references,
)
compute 要放在所有批次之后
compute() 有两种常见用法:直接接收完整的 predictions 和 references,或者不带数据、读取前面通过 add()/add_batch() 累积的内容。不要在每个 batch 后都调用一次并把中间分数当成全量最终分数,除非你的业务明确需要观察阶段性结果。
如果循环没有产生任何 batch,直接计算可能无法表达“本轮没有样本”的业务含义;可以在业务层记录样本数,并在没有数据时返回自己的空结果。Evaluate 指标还可能要求额外字段,所以遇到缺少参数时,应回到 metric.features 和对应指标说明,而不是盲目添加同名参数。
一次性计算和批量计算怎么选
| 场景 | 推荐写法 | 关注点 |
|---|---|---|
| 数据已经在内存中且规模小 | metric.compute(predictions=..., references=...) | 调用短,适合脚本和小样本示例 |
| 预测在循环中分批产生 | 多次 add_batch(),最后一次 compute() | 每批字段对应,最后不要漏算 |
| 换了一个指标或模块 | 先查看 features,再传对应字段 | 不要假设所有模块都只需要两列 |
我会保留的排查顺序
出现结果为空、参数错误或分数异常时,我会按这个顺序看:第一,确认 evaluate.load() 加载的是预期模块;第二,打印 features 对照字段名;第三,检查每个 batch 的预测和参考值长度;第四,确认所有 batch 都调用了 add_batch();第五,最后才检查指标本身的计算语义。这个顺序的好处是先排输入契约,再排数据流,通常比从公式开始猜更快。
相关问题
可以每个 batch 都调用 compute 吗?
可以,但每次得到的通常只是当前累计状态下的结果,不等于把所有 batch 都处理完后的最终结果。批量推理场景一般在循环结束后统一调用。
add_batch 的 predictions 和 references 必须同长度吗?
应当保持同一批次逐样本对应。长度不一致时不要继续累计,先定位数据切分或模型输出的对齐问题。
什么时候直接传给 compute 更简单?
当完整预测和标签已经可靠地放在内存中,而且数据量不大时,直接传给 compute() 最清楚;一旦预测是流式或分批产生,再改用 add_batch()。
Transformers pipeline 怎样指定推理设备
- 上一篇
- Transformers pipeline 怎样指定推理设备
- 下一篇
- Transformers save_pretrained 怎样保存可迁移模型
-
- 科技周边 · 人工智能 | 22分钟前 | pipeline device Transformers device_map 推理设备
- Transformers pipeline 怎样指定推理设备
- 212浏览 收藏
-
- 科技周边 · 人工智能 | 26分钟前 | python · 人工智能 · 并行处理 index Hugging Face Datasets Datasets shard num_shards contiguous
- Datasets shard 怎样切分数据集做并行处理
- 417浏览 收藏
-
- 科技周边 · 人工智能 | 27分钟前 | 人工智能 · 显存 Transformers 量化模型 bitsandbytes device_map
- Transformers 量化加载时如何选择 device_map
- 280浏览 收藏
-
- 科技周边 · 人工智能 | 28分钟前 | python · Transformers TextIteratorStreamer 流式生成 AsyncTextIteratorStreamer StoppingCriteria
- Transformers streamer 怎样处理生成停止信号
- 198浏览 收藏
-
- 科技周边 · 人工智能 | 30分钟前 | map Datasets batch_size batched 批量映射
- Datasets map 的 batched 参数怎样改变函数输入
- 279浏览 收藏
-
- 科技周边 · 人工智能 | 33分钟前 |
- Transformers GenerationConfig 保存生成参数与复用配置的方法
- 161浏览 收藏
-
- 科技周边 · 人工智能 | 33分钟前 | python · 人工智能 · Hugging Face padding Transformers attention_mask 注意力掩码
- Transformers attention_mask 缺失会有什么影响
- 453浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1029次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1030次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1173次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1133次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 973次使用
-
- go格式“占位符”输入输出 类似python的input
- 2023-01-19 346浏览
-
- Golang如何调用Python代码详解
- 2023-01-07 235浏览
-
- HTTP 的 response 中的响应体和头部是分开发送的吗?
- 2023-01-28 387浏览
-
- B站等视频网站的弹幕用的是 websocket 还是轮询?
- 2023-02-16 447浏览
-
- Linux 下有什么命令行工具以时序显示 CPU 占用率?
- 2023-01-13 360浏览

