使用Keras fit_generator
,steps_per_epoch应相当于样本的总数除以batch_size
。
但是如果我选择一个不适合样本n次的fit_generator
,生成器或batch_size
会如何反应?它是否会产生样本,直到它不能再填充整个batch_size
,或者只是使用较小的batch_size
作为最后的产量?
为什么我要问:我将数据划分为不同大小(不同%)的训练/验证/测试,但是对于训练和验证集使用相同的批量大小,尤其是对于训练和测试集。由于它们的大小不同,我不能保证批量大小符合样品的总量。
答案 0 :(得分:5)
yield
创建生成器的是你,所以行为是由你定义的。
如果steps_per_epoch
大于预期的批次,则fit将看不到任何内容,它只会继续请求批次,直到达到步骤数。
唯一的事情是:你必须保证你的发电机是无限的。
例如,在开头使用while True:
执行此操作。
ImageDataGenerator
的生成器。如果生成器来自ImageDataGenerator
,它实际上是keras.utils.Sequence
,并且它具有length属性:len(generatorInstance)
。
然后你可以检查一下自己会发生什么:
remainingSamples = total_samples % batch_size #confirm that this is gerater than 0
wholeBatches = total_samples // batch_size
totalBatches = wholeBatches + 1
if len(generator) == wholeBatches:
print("missing the last batch")
elif len(generator) == totalBatches:
print("last batch included")
else:
print('weird behavior')
并检查最后一批的大小:
lastBatch = generator[len(generator)-1]
if lastBatch.shape[0] == remainingSamples:
print('last batch contains the remaining samples')
else:
print('last batch is different')
答案 1 :(得分:2)
如果您将N
分配给steps_per_epoch
的参数fit_generator()
,Keras基本上会在考虑完一个纪元之前调用您的生成器N
次。由您的生成器决定以N
批次生成所有样本。
请注意,由于对于大多数模型而言,每次迭代都可以使用不同的批量大小,您可以修复steps_per_epoch = ceil(dataset_size / batch_size)
并让您的生成器为最后一个样本输出较小的批次。
答案 2 :(得分:0)
我遇到了同样的逻辑错误
通过定义 steps_per_epochs
BS = 32
steps_per_epoch=len(trainX) // BS
history = model.fit(train_batches,
epochs=initial_epochs,steps_per_epoch=steps_per_epoch,
validation_data=validation_batches)