数据集划分:两种目录结构选择与模型评估相关疑问
图像分类数据集划分与模型评估相关问题解答
1. 应采用哪种数据集划分目录结构?
两种结构各有适用场景,没有绝对的最优选择:
- 结构2(test按类别分文件夹):适合学术实验、模型快速验证场景。这种结构能让
flow_from_directory自动读取真实标签,直接用model.evaluate计算准确率,流程更简便高效。 - 结构1(test仅含一个子文件夹):更贴近真实生产部署场景——实际业务中测试数据不会预先按类别分好文件夹,这种结构适合需要做无标注预测的场景,或者需要手动匹配标签进行评估的场景。
2. 若采用结构1,如何提取标签并完成模型评估/预测?
结构1的test目录没有按类别划分,无法让flow_from_directory自动获取标签,需要手动准备标签文件(比如CSV格式,包含测试图像文件名和对应真实标签),步骤如下:
- 生成无标签的测试数据生成器:设置
class_mode=None和shuffle=False,确保生成器只返回图像数据,且顺序与文件夹内文件一致:
from tensorflow.keras.preprocessing.image import ImageDataGenerator test_generator = ImageDataGenerator(rescale=1./255).flow_from_directory( './test', # test目录下仅有一个存放所有测试图的子文件夹 target_size=(224, 224), batch_size=32, class_mode=None, # 不生成标签 shuffle=False # 固定文件顺序,方便匹配标签 )
- 加载并处理真实标签:读取预先准备的标签文件,将标签转换为与模型训练时一致的编码格式(需和训练时
train_generator.class_indices的映射关系匹配):
import pandas as pd import numpy as np # 读取标签文件,假设文件包含filename和label两列 labels_df = pd.read_csv('./test_labels.csv') # 训练时的类别映射,可从train_generator中获取 class_indices = {'cat': 0, 'dog': 1} true_labels = labels_df['label'].map(class_indices).values
- 评估或预测:
- 评估:先获取模型预测结果,再用真实标签计算准确率:
from sklearn.metrics import accuracy_score # 获取预测概率 pred_probs = model.predict(test_generator) # 转换为预测类别 pred_labels = np.argmax(pred_probs, axis=1) # 计算准确率 accuracy = accuracy_score(true_labels, pred_labels) print(f"测试准确率:{accuracy:.2f}")- 预测:直接用
model.predict得到结果,再映射回类别名称即可:
# 类别名称反向映射 class_names = {v: k for k, v in class_indices.items()} # 获取预测结果 pred_probs = model.predict(test_generator) pred_classes = [class_names[np.argmax(prob)] for prob in pred_probs] # 对应文件名 test_filenames = [name.split('/')[-1] for name in test_generator.filenames] # 输出预测结果 for filename, cls in zip(test_filenames, pred_classes): print(f"{filename}: {cls}")
3. 未提供标签时,为何split-folder相关流程能完成模型评估且无报错?
因为split-folder生成的结构2中,test目录是按类别分文件夹的,当你用flow_from_directory生成test_generator时,默认参数class_mode='categorical'(多分类场景)会自动将文件夹名称作为真实标签,生成的generator会同时输出图像数据和对应的标签。
model.evaluate方法接收generator作为输入时,会自动从generator中读取输入数据和标签,不需要你手动传入标签参数,因此即使你没显式提供标签,也能完成准确率计算,不会报错。
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

