如何获取LayoutLM推理中单个预测的置信度得分(百分比格式)
解决LayoutLMv2推理时获取单预测标签置信度的问题
你当前代码输出的是每个token对应的全标签概率分布,要获取对应预测标签的置信度(即模型对该预测标签的置信概率),需要根据预测的标签ID,从概率分布中提取对应位置的数值,再转换为百分比格式。
修改后的代码
import itertools import numpy as np import torch # 沿用原代码的前半部分逻辑 logits = outputs.logits predictions = logits.argmax(-1).squeeze().tolist() token_boxes = encoding.bbox.squeeze().tolist() # 对logits做softmax得到每个位置的全标签概率分布 probabilities = torch.nn.functional.softmax(logits, dim=-1).squeeze().tolist() # 处理单样本的维度对齐 if len(token_boxes) == 512: predictions = [predictions] token_boxes = [token_boxes] probabilities = [probabilities] # 展平列表 predictions = list(itertools.chain(*predictions)) token_boxes = list(itertools.chain(*token_boxes)) probabilities = list(itertools.chain(*probabilities)) # 过滤subword token is_subword = np.array(offset_mapping.squeeze().tolist())[:,0] != 0 true_predictions = [self.id2label[pred] for idx, pred in enumerate(predictions) if not is_subword[idx]] true_boxes = [box for idx, box in enumerate(token_boxes) if not is_subword[idx]] # 关键修改:根据预测标签ID提取对应概率,转百分比格式(保留两位小数) true_confidences = [ round(probabilities[idx][pred] * 100, 2) for idx, pred in enumerate(predictions) if not is_subword[idx] ] # 输出结果 for prediction, box, confidence in zip(true_predictions, true_boxes, true_confidences): print(f"标签: {prediction}, 位置框: {box}, 置信度: {confidence}%")
核心修改说明
- 精准提取目标概率:通过
probabilities[idx][pred]直接获取当前预测标签(pred为该位置的预测标签ID)对应的概率值,而非保留全标签概率分布。 - 格式转换:将概率值乘以100并保留两位小数,转换为直观的百分比置信度。
- 命名优化:将变量名改为
true_confidences,更贴合实际含义。
运行后会得到类似如下的清晰输出:
标签: O, 位置框: [10, 20, 50, 30], 置信度: 99.28% 标签: B-QUESTION, 位置框: [60, 20, 120, 30], 置信度: 87.56%
内容的提问来源于stack exchange,提问作者galex
相关产品推荐
相关产品推荐

