提问者:小点点

如果steps_per_epoch不适合大量的样本呢?


使用Kerasfit\u generator,每个历元的步数应等于可用样本总数除以批次大小

但是,如果我选择一个不适合n次样本的batch_size,生成器或fit_generator将如何反应?它会产生样本,直到它不能再填充整个batch_size,还是只使用较小的batch_size作为最后的产量?

提问原因:我将数据分为不同大小(不同%)的训练/验证/测试,但训练和验证集使用相同的批量,特别是训练和测试集。由于它们的大小不同,我不能保证批量大小适合样本总量。


共3个答案

匿名用户

是你创建了生成器,所以行为是由你定义的。

如果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)