Keras 如果每个历元的步长不适合样本数,该怎么办?
使用KerasKeras 如果每个历元的步长不适合样本数,该怎么办?,keras,generator,Keras,Generator,使用Kerasfit\u generator,每个历元的步数应等于可用样本总数除以批次大小 但是,如果我选择一个不适合样本n次的批量大小,生成器或fit\u生成器将如何反应?它是否会在无法填充整个批次大小之前产生样本,还是只使用较小的批次大小作为最后的产量 提问原因:我将数据分为不同大小(不同%)的训练/验证/测试,但训练和验证集使用相同的批量,特别是训练和测试集。由于它们的大小不同,我不能保证批量大小适合样本总量。如果是您的生成器,则产量 生成器是由您创建的,因此行为由您定义 如果steps\
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)
,并相应地改变一下下面的条件…?事实上,我只是“检查”了一个序列
生成器,看看它能做什么(因为你没有创建它)。