先求得 df_test 表征测试集数据。可以直接从 dataset 获得路径和标签信息:
# 先回忆一下 dataset 的来源。TEST_PATH 下面应该是各个标签的文件夹,里面是图片
dataset_test = torchvision.datasets.ImageFolder(TEST_PATH, transform_test)
df_test = pd.DataFrame()
# dataset_test.imgs 是元组的列表,元组 [0] 为路径,[1] 应该是标签。
df_test['path'] = [item[0] for item in dataset_test.imgs]
df_test['label_id'] = dataset_test.targets
df_test['label_name'] = [IDX_TO_LABEL[label_id] for label_id in dataset_test.targets]

再求得 df_pred 表征与各项相应的预测信息。预测流程见上一期,流程为 PIL Image → Input Tensor → Output Tensor → Confidence。
可以通过 torch.topk(confidence_tensor, TOP_NUMBER, dim=...) 获得前 K 个 confidence 的列表,返回的是一个 topk 对象,包括 topk.indices 和 topk.values 表示前 K 个下标和值。
dim=1,且出来的也是 [B, L]。topk 对象里取出来的还是张量,需要相应作 detach 等操作。最终预测数据就包括图像原始信息、预测的 top-K 信息、预测的所有 Confidence 信息。

(df_pred['is_top1_correct'] == True).sum() / len(df_pred)
可以使用 sklearn.metrics.classification_report() 方法进行各类别 P, R, F1 的求解。
print(sklearn.metrics.classification_report(df_pred['truth_name'], df_pred['top_1_name']))

如果指定 output_dict=True,就能生成可以直接变为 pd.Dataframe 对象的嵌套词典。
report = sklearn.metrics.classification_report(df_pred['truth_name'], df_pred['top_1_name'], output_dict=True)
pd_report = pd.DataFrame(report)