如何将flow_from_directory构建的Keras模型预测结果与测试Image_ID对应
顺序一致性说明
你得到的预测输出顺序和test.csv里的Image_ID顺序不一致。flow_from_directory加载测试集时,样本顺序是按照文件系统返回的文件名升序排列,和test.csv的行排序没有关联。
对应方法
Keras的DirectoryIterator生成器自带filenames属性,存储的就是生成器样本顺序对应的完整文件名,你可以通过这个属性做匹配:
- 先把预测结果压平为一维数组:
# 注意你提到的(1,m)形状大概率是维度顺序问题,正常predict_generator返回的是(m,1)结构 preds = model.predict_generator(test_it).flatten()
- 从测试生成器提取Image_ID:
import pandas as pd # 提取文件名并去掉.tif后缀,得到和csv匹配的Image_ID test_generator_ids = [filename.split('.')[0] for filename in test_it.filenames]
- 匹配test.csv的顺序:
# 读取原始test.csv test_df = pd.read_csv("test.csv") # 生成预测结果表 pred_df = pd.DataFrame({ "Image_ID": test_generator_ids, "pred_score": preds }) # 按Image_ID字段合并,得到和原始test.csv顺序完全一致的结果 result_df = pd.merge(test_df, pred_df, on="Image_ID", how="left") # 如果需要输出二分类标签,加阈值判断即可,示例阈值为0.5 result_df["Target"] = (result_df["pred_score"] >= 0.5).astype(int)
注意事项
你当前的测试生成器设置了class_mode=None,这种情况下flow_from_directory默认shuffle=False,配合你设置的固定seed,生成器的样本顺序和filenames属性的顺序完全一致,不会出现乱序。如果要更稳妥,你可以在构建test_it时显式加上shuffle=False参数。
内容的提问来源于stack exchange,提问作者Darkstar Dream
相关产品推荐
相关产品推荐

