如何使用Keras ImageDataGenerator为pix2pix CNN模型喂入训练数据
问题根因
- 你直接调用两个独立
flow_from_directory实例的next()方法,没有走你自定义JoinedGen的同步逻辑,两个生成器的迭代、随机增强参数都是独立生成的,自然无法得到配对的输入输出对 - 即使使用
JoinedGen封装,你当前没有为两个生成器绑定相同的随机种子,同位置的输入、目标图像会应用不同的空间变换(剪切、缩放、翻转等),也不符合pix2pix的训练要求 - 若
area和sat文件夹下的对应图像文件名不一一对应、排序不一致,即使索引同步也会读取到不匹配的图像对
修正方案
1. 为所有生成器绑定相同随机种子
在四个flow_from_directory调用时统一添加相同的seed参数,保证同位置的输入、目标图像应用完全一致的增强参数:
generator = ImageDataGenerator(shear_range=0.2, zoom_range=0.2, horizontal_flip=True, validation_split=0.3) input_gen = generator.flow_from_directory(path, classes=['area'], shuffle=False, target_size=(256, 256), class_mode=None, batch_size=32, subset='training', seed=42) # 新增相同随机种子 target_gen = generator.flow_from_directory(path, classes=['sat'], shuffle=False, target_size=(256, 256), class_mode=None, batch_size=32, subset='training', seed=42) # 和输入生成器种子一致 input_gen_val = generator.flow_from_directory(path, classes=['area'], shuffle=False, target_size=(256, 256), class_mode=None, batch_size=32, subset='validation', seed=42) # 验证集也用相同种子 target_gen_val = generator.flow_from_directory(path, classes=['sat'], shuffle=False, target_size=(256, 256), class_mode=None, batch_size=32, subset='validation', seed=42) # 和验证输入生成器种子一致
2. 通过封装后的JoinedGen读取数据
不要单独调用两个生成器的next(),统一用你自定义的JoinedGen封装后读取,才会触发索引同步逻辑:
# 封装生成器 train_gen = JoinedGen(input_gen, target_gen) val_gen = JoinedGen(input_gen_val, target_gen_val) # 读取第一批配对数据 x_batch, y_batch = train_gen[0] # 第一个配对对为 x_batch[0], y_batch[0]
3. 额外校验项
- 确保
area和sat文件夹下的对应图像文件名完全一致,排序规则相同 - 如果需要开启shuffle,要把输入、目标生成器的
shuffle参数同时设为True,依靠JoinedGen的on_epoch_end逻辑同步索引数组
内容的提问来源于stack exchange,提问作者Marlon Teixeira
相关产品推荐
相关产品推荐

