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

图像数据集划分与Keras数据生成器标签及验证集问题求助

解决图像数据集划分与Keras生成器使用问题

我来帮你理清这两个问题,都是Keras图像生成器使用中常见的小坑:

问题1:关于y_train/y_val标签的疑问

首先,你用flow_from_directory创建的training_data和test_data都是数据生成器对象,不是单纯的特征数组。这个生成器在每次迭代的时候,会自动返回一个元组(batch_x, batch_y)——其中batch_x是一批图像数据,batch_y就是对应的标签(因为你设置了class_mode='binary',所以标签是0/1的二进制值)。

所以你不需要手动去定义单独的y_train或y_val变量,生成器已经帮你把特征和标签绑定好了。当你用fit(现在Keras更推荐用这个替代fit_generator)训练时,直接传入这个生成器就行,它会自动处理特征和标签的配对。

问题2:拆分训练集与验证集的错误解决

你用train_test_split拆分training_data是行不通的,因为train_test_split是用来处理内存中的数组数据,而flow_from_directory返回的是迭代器,不是数组。这就导致拆分后的x_val不符合模型期望的(val_x, val_y)元组格式,所以会抛出那个ValueError。

这里有两种靠谱的解决方法:

方法1:用生成器自带的validation_split参数

你可以在定义train_datagen的时候,加上validation_split参数指定验证集比例,然后分别创建训练和验证生成器:

# 初始化数据生成器时指定验证集比例(记得加上数据预处理,比如归一化)
train_datagen = ImageDataGenerator(
    rescale=1./255,
    validation_split=0.1  # 拿出10%的数据作为验证集
)

# 创建训练集生成器,subset设为'training'
training_data = train_datagen.flow_from_directory(
    './images/train',
    target_size=(28, 28),
    batch_size=86,
    class_mode='binary',
    color_mode='rgb',
    subset='training'  # 指定这是训练子集
)

# 创建验证集生成器,subset设为'validation'
val_data = train_datagen.flow_from_directory(
    './images/train',
    target_size=(28, 28),
    batch_size=86,
    class_mode='binary',
    color_mode='rgb',
    subset='validation'  # 指定这是验证子集
)

# 训练模型时直接传入两个生成器,用生成器自身的samples属性计算步数更准确
history = classifier.fit(
    training_data,
    steps_per_epoch=training_data.samples // training_data.batch_size,
    epochs=2,
    validation_data=val_data,
    validation_steps=val_data.samples // val_data.batch_size,
    callbacks=[learning_rate_reduction]
)

方法2:手动划分文件夹结构

如果你想更直观地控制训练和验证数据,可以把原训练文件夹里的文件手动拆分到train和val两个子文件夹中,结构如下:

images/
├── train/
│   ├── Bunny/
│   └── Puppy/
├── val/
│   ├── Bunny/
│   └── Puppy/
└── test/
    ├── Bunny/
    └── Puppy/

然后分别用flow_from_directory加载三个生成器:

training_data = train_datagen.flow_from_directory(
    './images/train',
    target_size=(28, 28),
    batch_size=86,
    class_mode='binary',
    color_mode='rgb'
)

val_data = val_datagen.flow_from_directory(
    './images/val',
    target_size=(28, 28),
    batch_size=86,
    class_mode='binary',
    color_mode='rgb'
)

test_data = test_datagen.flow_from_directory(
    './images/test',
    target_size=(28, 28),
    batch_size=86,
    class_mode='binary',
    color_mode='rgb'
)

这种方法的好处是你可以完全控制哪些数据进训练集、哪些进验证集,适合需要特定数据划分的场景。

内容的提问来源于stack exchange,提问作者user10908656

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:44:41