使用classification_report输出精确率、召回率与F1值时出现AttributeError的解决方法咨询
修复classification_report触发的AttributeError问题
嘿,我来帮你搞定这个AttributeError的问题!首先得搞清楚错误出在哪:你用random_split拆分出来的test是PyTorch的Subset类实例,它没有targets和classes这两个属性——这俩属性是属于你最开始创建的ImageFolder数据集data_loader的,直接访问test.targets自然会报错。
下面给你两种靠谱的修复方案,选哪个都行:
方案一:从原始数据集提取测试集真实标签
因为Subset里保存了测试集样本在原始数据集中的索引,我们可以用这些索引去原始数据集里拿对应的标签:
# 先获取测试集对应的真实标签 true_labels = np.array([data_loader.targets[i] for i in test.indices]) # 类别名称直接用原始数据集的classes class_names = data_loader.classes # 生成分类报告 print(classification_report(true_labels, np.array(preds), target_names=class_names))
方案二:遍历测试集时同步收集真实标签
这种方式更直观,在你遍历test_dl做预测的时候,顺便把每个batch的真实标签存下来:
# 修正你代码里的笔误:model.evaL()改成model.eval() model.eval() preds = [] true_labels = [] # 新增列表存储真实标签 # 修正代码错误:把code with改成with with torch.no_grad(): for (x, y) in test_dl: x = x.to(device) pred = model(x) preds.extend(pred.argmax(axis=1).cpu().numpy()) true_labels.extend(y.cpu().numpy()) # 同步收集真实标签 # 生成分类报告,类别名称用原始数据集的classes print(classification_report(np.array(true_labels), np.array(preds), target_names=data_loader.classes))
另外还要提醒你:你原来的代码里有两个小笔误得修正,不然也会报错:
model.evaL()里的L是大写的,应该改成model.eval()code with torch.no_grad()是错误写法,要改成with torch.no_grad():
内容的提问来源于stack exchange,提问作者stribb
相关产品推荐
相关产品推荐

