PyTorch自定义CNN无predict方法,如何生成分类报告?
报错根因
两处核心问题直接导致当前代码无法运行:
- 你尝试复用的
.predict()是TensorFlow/Keras框架的模型推理接口,当前使用的是原生PyTorch实现的自定义CNN,本身不存在该方法,因此触发属性不存在的报错 - 现有
fit函数仅打印训练指标,未实际返回损失、准确率数值,即使解决了接口问题,训练循环处的变量接收逻辑也会运行失败
具体改造方案
1. 补全fit函数的返回值逻辑
将fit函数最后仅做打印的代码段,替换为实际返回对应指标:
# 替换原fit函数末尾的print行 train_accuracy = 100. * train_running_correct / len(train_dataloader.dataset) print(f"Train Loss: {train_loss:.4f}, Train Acc: {train_accuracy:.2f}") # 新增这行返回逻辑 return train_loss, train_accuracy
2. 新增独立的分类报告生成函数
分类报告是模型全量训练完成后的最终评估环节,不需要嵌入到每轮训练流程中避免拖慢训练速度。函数逻辑和现有验证流程完全同源,仅额外收集所有测试集批次的真实标签、预测标签,供报告计算使用:
from sklearn.metrics import classification_report def get_final_classification_report(model, test_dataloader, class_names): model.eval() collected_preds = [] collected_truth = [] with torch.no_grad(): for batch_imgs, batch_labels in tqdm(test_dataloader, desc="生成最终分类报告中"): batch_imgs = batch_imgs.to(device) batch_labels = batch_labels.to(device) # 走和验证、推理完全一致的前向传播逻辑 batch_output = model(batch_imgs) # 提取每个样本的预测类别索引 _, batch_pred = torch.max(batch_output, 1) # 把GPU上的张量转到CPU、转成numpy格式后拼接为全量列表 collected_preds.extend(batch_pred.cpu().numpy()) collected_truth.extend(batch_labels.cpu().numpy()) # 直接生成打印完整分类报告 print(classification_report(collected_truth, collected_preds, target_names=class_names))
3. 调整代码执行顺序
把分类报告的调用放在全量训练流程结束、模型权重保存之前的位置,不要插入到训练循环内部:
- 先跑完所有训练轮次的fit、validate流程,累计训练/验证的损失、准确率指标
- 完成训练、验证的损失/准确率曲线绘制
- 调用
get_final_classification_report(model, testloader, lb.classes_)生成正式的分类报告 - 最后执行模型权重保存、训练完成提示的逻辑
避坑要点
- 不需要给自定义PyTorch模型强行绑定Keras风格的
.predict()方法,现有代码的推理路径走model(输入数据)的前向传播逻辑已经完全可用,强行适配跨框架接口只会增加不必要的改造量 - 收集标签时必须将张量从GPU设备转移到CPU后再转换为numpy数组,否则会触发设备不匹配的类型报错
- 不要在每轮训练时都生成分类报告,全量测试集推理会大幅拉长训练周期,分类报告仅需在最终模型上运行一次即可
内容的提问来源于stack exchange,提问作者KSp
相关产品推荐
相关产品推荐

