要训练frcnn模型,您需要定义两个参数,
epoch_length的默认值为1000。此外,如果我有500个num_epochs,则每个时期的长度为1000步。在this文章中指出:“请注意,每个批次仅在此处处理一个图像。”
所以如果我只有一堂课要训练1300张图像,那我应该将epoch_length更改为1300而不是1000吗?
num_epochs = 500
epoch_length = 1000
for epoch_num in range(num_epochs):
progbar = generic_utils.Progbar(epoch_length)
print('Epoch {}/{}'.format(epoch_num + 1, num_epochs))
答案 0 :(得分:1)
通常,每次不需要(或无法)遍历每个时期的整个数据集时,您都可以使用epoch_length
(或等效参数)。
事实上, epoch 的最常见定义如下:
一个纪元=所有训练一次传球(前进+后退) 例子
按照这个通用定义,您的模型应“查看”所有训练示例以声明一个时代的结束;然后下一个开始。在这种情况下,对 n 个时期的训练意味着该模型在 n 次中看到了每个训练示例。
但是,这并不总是可行的/您想做什么。
作为一个极端的例子,想象一下您正在使用合成数据训练模型,这些数据是由数据加载器动态生成的。在这种情况下,您的训练数据实际上是无限的,因此没有“迭代所有训练示例”的概念。一个时代将永远持续。在时代末期调用的任何回调(例如保存模型权重,计算指标)都将永远不会运行。
要解决此问题,您可以人为地定义多个批处理,这些批处理在您的特定应用程序中界定了一个时期。因此,您可以说epoch_length=1000
,这意味着在训练了1000个示例/批次之后,您认为纪元已终止,而您又开始了一个新纪元。通过这种方式,您可以决定在时代结束时执行的每个操作(例如上述回调,日志记录等)执行的粒度。