Keras fit_generator中batch_size无法整除样本数时的行为问询
关于Keras
fit_generator处理非整除批次的问题 首先直接给你答案:默认情况下,如果你用的是Keras自带的数据生成器(比如ImageDataGenerator.flow()),最后一批会自动返回剩余的样本(数量小于batch_size),不会丢弃;但如果你是自定义生成器,行为完全取决于你自己的代码逻辑。
下面分情况详细拆解:
1. 自带生成器的行为
比如用ImageDataGenerator的flow()或flow_from_directory()生成数据时,这些内置生成器会自动处理样本数不能被batch_size整除的情况:当遍历到最后一批时,会把剩下的所有样本打包成一个小批次返回,不会跳过。
这时候你需要注意steps_per_epoch的设置:
- 如果你设
steps_per_epoch = 总样本数 // batch_size,那最后一批小样本会被忽略,训练时只会处理完整的批次 - 如果你设
steps_per_epoch = (总样本数 + batch_size - 1) // batch_size(也就是向上取整的写法),那生成器会返回最后一批小样本,fit_generator也会正常处理它
2. 自定义生成器的行为
如果你自己写了生成器函数,那最后一批的处理完全由你决定:
- 如果你的生成器逻辑是“凑不够
batch_size就停止生成”,那当fit_generator执行到第总样本数//batch_size步后,生成器会抛出StopIteration,训练会提前结束,最后一批小样本被丢弃 - 如果你的生成器逻辑是“凑不够就返回剩余样本”,那只要
steps_per_epoch设为向上取整的数值,fit_generator就会正常处理最后一批
针对你的场景的实用建议
你要给训练/验证/测试集用相同的batch_size,但各集样本量不同,这里给你几个落地方案:
- 训练集:如果不想浪费数据,就把
steps_per_epoch设为向上取整的数值,同时确保生成器(不管自带还是自定义)能返回最后一批小样本;如果觉得少量样本对训练影响不大,也可以直接用总样本数//batch_size,忽略最后一批 - 验证集:
validation_steps的设置逻辑和steps_per_epoch完全一致,根据你是否想保留最后一批小样本选择对应的值 - 测试集:如果用
predict_generator,逻辑同上;更推荐直接用model.predict(),把测试数据打包成数组传入,它会自动处理所有样本,不用纠结批次问题
额外提醒
现在TensorFlow 2.x集成的Keras已经弃用了fit_generator,官方推荐使用model.fit()配合tf.data.Dataset来处理数据。Dataset的batch()方法可以通过drop_remainder参数直接控制是否丢弃最后一批小样本:
# 丢弃最后一批小样本 dataset = dataset.batch(batch_size, drop_remainder=True) # 保留最后一批小样本(默认行为) dataset = dataset.batch(batch_size, drop_remainder=False)
这种方式更灵活,也更符合现代Keras的使用习惯。
内容的提问来源于stack exchange,提问作者Florida Man
相关产品推荐
相关产品推荐

