使用Kerasfit\u generator
,每个历元的步数应等于可用样本总数除以批次大小
。
但是,如果我选择一个不适合n次样本的batch_size
,生成器或fit_generator
将如何反应?它会产生样本,直到它不能再填充整个batch_size
,还是只使用较小的batch_size
作为最后的产量?
提问原因:我将数据分为不同大小(不同%)的训练/验证/测试,但训练和验证集使用相同的批量,特别是训练和测试集。由于它们的大小不同,我不能保证批量大小适合样本总量。
是你创建了生成器,所以行为是由你定义的。
如果steps\u per\u epoch
大于预期的批数,fit将看不到任何内容,它将继续请求批数,直到达到步骤数为止。
唯一的问题是:你必须确保你的发电机是无限的。
例如,在开始时使用而不是True:
执行此操作。
如果生成器来自ImageDataGenerator
,则它实际上是keras。乌提尔斯。序列
并且它具有长度属性: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')
如果您将N
分配给fit_generator()
的参数steps_per_epoch
,Keras基本上会在考虑完成一个时代之前调用生成器N
次。由您的生成器以N
批次生成所有样品。
请注意,因为对于大多数模型来说,每次迭代都有不同的批次大小是可以的,所以您可以修复steps_per_epoch=ceil(dataset_size/batch_size)
,并让您的生成器为最后一个样本输出较小的批次。
我面临着同样的逻辑错误,通过定义每个时代的步骤解决了这个问题
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)