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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:45