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

Keras fit_generator各轮次数据加载规则及samples_per_epoch参数作用问询

关于Keras fit_generator的epoch样本选取问题

这个问题的核心其实不在fit_generator本身,而在于你自己实现的生成器(generator)逻辑——我来给你掰扯清楚:

  • 首先明确:fit_generator的samples_per_epoch参数只是用来定义「一个epoch要从生成器里取多少个样本后就结束当前epoch」,它不会自动帮你做样本的随机切换或重选。
  • 回到你的场景:总共有20000个训练样本,samples_per_epoch设为5000,下一个epoch的样本是否重复,完全看你的生成器怎么写:
    1. 如果你的生成器每次启动(或者每个epoch开始前)都会打乱全部样本的顺序,然后按顺序取5000个样本,那每个epoch的样本大概率都是不同的随机子集。比如常见的写法是在生成器里用np.random.shuffle()打乱样本索引列表,再按batch逐个取数据。
    2. 如果你的生成器是固定从某一段(比如前5000个)取样本,或者每次都返回同一批数据,那每个epoch的样本就会完全一样。

举个简单的生成器例子,这种写法会让每个epoch的样本都是随机的:

def my_generator(data, labels, batch_size):
    num_samples = len(data)
    while True:
        # 每个epoch开始前打乱索引
        indices = np.random.permutation(num_samples)
        for i in range(0, num_samples, batch_size):
            batch_indices = indices[i:i+batch_size]
            yield data[batch_indices], labels[batch_indices]

当你把samples_per_epoch设为5000时,Keras会从这个生成器里取够5000个样本就结束当前epoch;下一个epoch时,生成器会再次执行np.random.permutation()打乱索引,所以取到的就是新的随机样本。

另外补充一句:现在Keras的新版本已经把fit_generator的功能整合到fit()里了,直接用fit()传入生成器或者tf.data.Dataset即可,但样本选取的逻辑是完全一致的——随机性由你的数据管道决定,框架不会替你做默认的随机采样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:07:47