PyTorch搭建CNN后生成全测试集混淆矩阵报错如何解决
问题根源
- 你收集标签和预测结果的逻辑存在两处核心错误:一是往
actual_labels和total_predictions中追加的是每个batch的带批次维度的张量,最终列表是[batch1张量, batch2张量...]的嵌套结构,不符合sklearn要求的一维序列输入格式,因此触发多标签格式报错;二是推理代码存在变量名错误,你计算得到的预测结果是predicted,但你往列表中追加的是未定义先使用的final_pred,收集的预测值本身就不正确。 - 你之前在循环内调用混淆矩阵方法,只用到了最后一个batch的标签和预测值,自然只能得到最后一个batch的计算结果。
修正后完整代码
第一步:修正推理阶段的结果收集逻辑
import torch import numpy as np from sklearn.metrics import confusion_matrix import pandas as pd correct = 0 total_predictions = [] actual_labels = [] with torch.no_grad(): for images, labels in testloader: images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) # 把当前batch的标签和预测转成CPU端numpy数组再存入列表 actual_labels.append(labels.cpu().numpy()) total_predictions.append(predicted.cpu().numpy()) correct += (predicted == labels).sum().item() # 把所有batch的数组合并为一维数组,适配sklearn输入要求 actual_labels = np.concatenate(actual_labels) total_predictions = np.concatenate(total_predictions)
第二步:生成全测试集混淆矩阵
label_map = { 'healthy_wheat': 0, 'leaf_rust': 1, 'stem_rust': 2 } label_names = list(label_map.keys()) label_values = list(label_map.values()) def conf_mat(y_true, y_pred, label_names, label_values, **kwargs): conf_mat_arr = confusion_matrix(y_true, y_pred, labels=label_values, **kwargs) df = pd.DataFrame(conf_mat_arr, columns=label_names, index=label_names) df.columns.name = "预测值" df.index.name = "真实值" return df # 调用方法生成混淆矩阵 result_df = conf_mat(actual_labels, total_predictions, label_names, label_values, normalize="true") print(result_df)
关键修改说明
- 每个batch的结果先转成CPU numpy数组再存储,避免设备不兼容问题
- 所有batch迭代完成后用
np.concatenate合并为一维数组,彻底解决嵌套序列报错 - 调用
confusion_matrix时labels参数传入标签对应的数值列表,不要直接传入字典,避免参数类型不匹配 - 修正了推理阶段变量名写错的问题,保证收集的预测值正确
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

