如何获取CNN神经网络分类预测结果的置信度/类别概率
文本CNN分类模型预测置信度获取方案
核心原理
你的模型最后输出层使用softmax激活函数,调用model.predict()得到的返回值本身就是所有类别的概率分布数组,不需要修改模型结构或者重新训练,只需要调整预测阶段的取值逻辑就能拿到置信度。
原有逻辑问题
model.predict(x)返回的数组形状为(输入样本数, 类别总数),数组中每个元素的取值范围是0~1,对应样本属于该类别的概率,单条样本所有类别概率和为1- 原有逻辑直接对返回结果调用
argmax(axis=1)只取了最大概率对应的类别索引,丢弃了索引位置对应的概率数值,因此拿不到置信度。
可直接复用的实现代码
修改后的单样本预测逻辑
x = x.lower() x = remove_URL(x) x = remove_punct(x) x = remove_stopwords(x) x = tokenizer.texts_to_sequences([x]) x = pad_sequences(x, maxlen=maxlen) # 拿到所有类别的概率分布 pred_probs = model.predict(x, verbose=0) # 取概率最高的类别索引 pred_idx = pred_probs.argmax(axis=1)[0] # 取该索引对应的概率值,即为当前预测结果的置信度 pred_confidence = pred_probs[0][pred_idx] # 索引映射为实际类别名 pred_class = le.classes_[pred_idx] # 按需返回结果,示例为返回类别名+对应置信度 return pred_class, round(float(pred_confidence), 4)
批量预测场景快速取值
如果是批量预测多条样本,不需要逐样本遍历,可以直接批量拿到所有样本的预测类别和对应置信度:
# 批量输入得到概率分布 batch_pred_probs = model.predict(batch_x, verbose=0) # 批量取每个样本的预测类别索引 batch_pred_idx = batch_pred_probs.argmax(axis=1) # 批量取每个样本预测类别的置信度 batch_pred_conf = batch_pred_probs.max(axis=1) # 批量映射类别名 batch_pred_class = le.classes_[batch_pred_idx]
扩展用法
如果需要拿到单条样本所有类别的对应概率,可以直接将概率数组和类别名打包为字典:
all_class_prob = dict(zip(le.classes_, pred_probs[0]))
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

