Keras:调用fit_generator时flow_from_directory保存过多图像
问题分析与解决办法
我来帮你拆解一下为什么明明epochs、steps_per_epoch、validation_steps以及数据集图像数都设为1,调用fit_generator时却会保存多张图像,以及对应的解决办法:
可能的核心原因
1. 数据生成器的batch_size默认值“搞事情”
flow_from_directory的默认batch_size是32——哪怕你的数据集只有1张图像,生成器也会重复这张图来填满整个batch。如果你的代码里设置了每个batch处理后保存图像(比如自定义回调、生成器可视化逻辑),那一次steps_per_epoch=1的运行就会生成32张重复的图像,自然会保存多张。
2. 回调函数的触发频率不对
如果用了ModelCheckpoint或者自定义的图像保存回调,可能触发条件不是按epoch,而是按batch:
- 比如
ModelCheckpoint的save_freq如果设为数值(比如1),就会每1个batch保存一次; - 自定义回调里如果在
on_batch_end方法里写了保存逻辑,那steps_per_epoch=1就会触发一次保存,但batch里有多张图的话,就会批量保存。
3. 生成器的重复机制(次要)
flow_from_directory默认repeat=True(生成器会无限重复数据),不过结合steps_per_epoch=1,这个只会影响是否能持续生成数据,但如果batch_size大于1,还是会导致单batch里有多张重复图。
针对性解决步骤
1. 把batch_size强制设为1
在调用flow_from_directory时明确指定batch_size=1,这样每个batch只会加载1张图像,从根源上避免重复:
train_generator = train_datagen.flow_from_directory( "你的训练目录路径", target_size=(img_height, img_width), batch_size=1, # 关键修改点 class_mode="categorical" # 根据你的任务类型调整,比如binary、input等 ) val_generator = val_datagen.flow_from_directory( "你的验证目录路径", target_size=(img_height, img_width), batch_size=1, class_mode="categorical" )
2. 修正回调函数的触发时机
- 如果用
ModelCheckpoint,确保save_freq='epoch'(默认值),这样只会在每个epoch结束时保存一次:
from keras.callbacks import ModelCheckpoint checkpoint = ModelCheckpoint( "model_checkpoint.h5", save_freq="epoch", # 明确按epoch保存 save_best_only=True # 可选,只保存最优模型 )
- 如果是自定义的图像保存回调,把保存逻辑放在
on_epoch_end方法里,而不是on_batch_end:
from keras.callbacks import Callback import cv2 class SaveSingleImageCallback(Callback): def __init__(self, val_generator): self.val_generator = val_generator def on_epoch_end(self, epoch, logs=None): # 只在epoch结束时加载并保存1张验证图像/预测结果 x_val, _ = next(self.val_generator) pred_mask = self.model.predict(x_val)[0] # 保存图像的逻辑,这里以保存预测掩码为例 cv2.imwrite(f"epoch_{epoch}_pred_mask.png", pred_mask * 255)
3. 验证调整效果
运行训练前,先打印生成器的batch形状,确认batch里只有1张图:
x_batch, y_batch = next(train_generator) print(f"训练集batch形状: {x_batch.shape}") # 应该输出 (1, img_height, img_width, channels)
如果输出是(32, ...),说明batch_size没改对,回去检查代码。
调整后再运行训练,应该只会保存1张对应的数据图像/预测结果了。
内容的提问来源于stack exchange,提问作者John Cast
相关产品推荐
相关产品推荐

