如果steps_per_epoch不适合样本数量怎么办?

时间:2018-06-01 12:57:18

标签: keras generator

使用Keras fit_generator,steps_per_epoch应相当于样本的总数除以batch_size

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

为什么我要问:我将数据划分为不同大小(不同%)的训练/验证/测试,但是对于训练和验证集使用相同的批量大小,尤其是对于训练和测试集。由于它们的大小不同,我不能保证批量大小符合样品的总量。

3 个答案:

答案 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)