在训练Faster R-CNN模型时-'epoch_length'是什么意思?

时间:2019-11-27 09:50:38

标签: image-processing deep-learning computer-vision classification object-detection

要训练frcnn模型,您需要定义两个参数,

  1. num_epochs
  2. epoch_length

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

1 个答案:

答案 0 :(得分:1)

通常,每次不需要(或无法)遍历每个时期的整个数据集时,您都可以使用epoch_length(或等效参数)。

事实上, epoch 的最常见定义如下:

  

一个纪元=所有训练一次传球(前进+后退)   例子

按照这个通用定义,您的模型应“查看”所有训练示例以声明一个时代的结束;然后下一个开始。在这种情况下,对 n 个时期的训练意味着该模型在 n 次中看到了每个训练示例。

但是,这并不总是可行的/您想做什么。

作为一个极端的例子,想象一下您正在使用合成数据训练模型,这些数据是由数据加载器动态生成的。在这种情况下,您的训练数据实际上是无限的,因此没有“迭代所有训练示例”的概念。一个时代将永远持续。在时代末期调用的任何回调(例如保存模型权重,计算指标)都将永远不会运行。

要解决此问题,您可以人为地定义多个批处理,这些批处理在您的特定应用程序中界定了一个时期。因此,您可以说epoch_length=1000,这意味着在训练了1000个示例/批次之后,您认为纪元已终止,而您又开始了一个新纪元。通过这种方式,您可以决定在时代结束时执行的每个操作(例如上述回调,日志记录等)执行的粒度。