You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据集划分:两种目录结构选择与模型评估相关疑问

图像分类数据集划分与模型评估相关问题解答

1. 应采用哪种数据集划分目录结构?

两种结构各有适用场景,没有绝对的最优选择:

  • 结构2(test按类别分文件夹):适合学术实验、模型快速验证场景。这种结构能让flow_from_directory自动读取真实标签,直接用model.evaluate计算准确率,流程更简便高效。
  • 结构1(test仅含一个子文件夹):更贴近真实生产部署场景——实际业务中测试数据不会预先按类别分好文件夹,这种结构适合需要做无标注预测的场景,或者需要手动匹配标签进行评估的场景。

2. 若采用结构1,如何提取标签并完成模型评估/预测?

结构1的test目录没有按类别划分,无法让flow_from_directory自动获取标签,需要手动准备标签文件(比如CSV格式,包含测试图像文件名和对应真实标签),步骤如下:

  1. 生成无标签的测试数据生成器:设置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     # 固定文件顺序,方便匹配标签
)
  1. 加载并处理真实标签:读取预先准备的标签文件,将标签转换为与模型训练时一致的编码格式(需和训练时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
  1. 评估或预测:
    • 评估:先获取模型预测结果,再用真实标签计算准确率:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:06:24