Keras:使用生成器预测并生成图像分类结果对照表
解决Keras生成器预测后匹配文件名与类别问题
直接给你可行的解决方案,步骤如下:
1. 固定生成器顺序,保证预测与文件名对应
修改flow_from_directory的参数,添加shuffle=False,关闭生成器的打乱功能,这样预测结果的顺序会和生成器存储的文件名顺序完全一致:
test_generator = datagen.flow_from_directory( r"C:\new_data", target_size=(260, 180), batch_size=100, color_mode="grayscale", class_mode="categorical", shuffle=False # 关键:关闭打乱,确保顺序匹配 )
2. 获取文件名与类别映射关系
生成器自带两个实用属性:
test_generator.filenames:存储所有输入图像的路径(如果图像放在分类子目录下,格式为子目录/文件名;如果直接放在根目录,就是纯文件名)test_generator.class_indices:是类别名到索引的字典(比如{'coffee':0, 'car':1}),我们需要反转它得到索引到类别名的映射:
# 生成索引到类别名的映射字典 idx_to_class = {v: k for k, v in test_generator.class_indices.items()}
3. 处理预测结果,匹配文件名与类别
执行预测后,把概率数组转换成类别索引,再映射成对应的类别名:
# 执行预测(用生成器的batch_size即可,无需单独设置) predicted_elements = model.predict(test_generator, verbose=1) # 获取每个样本的预测类别索引(取概率最大值对应的索引) predicted_indices = predicted_elements.argmax(axis=1) # 将索引转换为类别名 predicted_classes = [idx_to_class[idx] for idx in predicted_indices]
4. 生成对照表
用pandas生成结构化表格,方便查看和保存:
import pandas as pd # 创建结果DataFrame result_df = pd.DataFrame({ 'filename': test_generator.filenames, 'prediction': predicted_classes }) # 查看前几行验证结果 print(result_df.head()) # 保存为CSV文件(可选,便于后续查看或处理) result_df.to_csv('prediction_results.csv', index=False)
如果你的图像直接放在C:\new_data根目录下,test_generator.filenames就是纯文件名,完全符合你要的格式;如果图像在子目录里,可通过以下代码提取纯文件名:
import os filenames = [os.path.basename(path) for path in test_generator.filenames]
内容的提问来源于stack exchange,提问作者mirArnold
相关产品推荐
相关产品推荐

