You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:07:27