Keras 如果每个历元的步长不适合样本数,该怎么办?

Keras 如果每个历元的步长不适合样本数,该怎么办?,keras,generator,Keras,Generator,使用Kerasfit\u generator,每个历元的步数应等于可用样本总数除以批次大小 但是,如果我选择一个不适合样本n次的批量大小,生成器或fit\u生成器将如何反应?它是否会在无法填充整个批次大小之前产生样本,还是只使用较小的批次大小作为最后的产量 提问原因:我将数据分为不同大小(不同%)的训练/验证/测试,但训练和验证集使用相同的批量,特别是训练和测试集。由于它们的大小不同,我不能保证批量大小适合样本总量。如果是您的生成器,则产量 生成器是由您创建的,因此行为由您定义 如果steps\

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

但是,如果我选择一个不适合样本n次的
批量大小
,生成器或
fit\u生成器将如何反应?它是否会在无法填充整个
批次大小之前产生样本,还是只使用较小的
批次大小作为最后的产量

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

如果是您的生成器,则产量

生成器是由您创建的,因此行为由您定义

如果
steps\u per\u epoch
大于预期的批数,fit将看不到任何内容,它将继续请求批数,直到达到步骤数为止

唯一的问题是:你必须保证你的发电机是无限的

例如,在开始时使用
而不是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')

如果将
N
分配给
fit\u generator()
的参数
steps\u per\u epoch
,Keras基本上会在考虑完成一个epoch之前调用生成器
N
次。您的生成器可以批量生成所有样本


请注意,由于对于大多数模型,每次迭代都可以使用不同的批处理大小,因此您可以修复
步骤\u per\u epoch=ceil(数据集大小/批处理大小)
,并让生成器为最后的样本输出较小的批处理。

。很高兴再次见到你,我使用了一个经典的“while nSee改进答案。更完整的答案是:)然而,为了涵盖
total_samples
batch_size
的倍数的情况,我会写
totalBatches=wholeBatches+(remainingSamples!=0)
(或者干脆写
totalBatches=np.ceil(total_samples/batch_size)
,并相应地改变一下下面的条件…?事实上,我只是“检查”了一个
序列
生成器,看看它能做什么(因为你没有创建它)。