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

In training a Faster R-CNN model - What does 'epoch_length' mean?

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

  1. num_epochs
  2. epoch_length

epoch_length 的默认值为 1000。另外,如果我有 500 num_epochs,那么每个纪元就是 1000 步长。在 this 文章中指出 'Note that every batch only processes one image in here.'

因此,如果我只有一个 class 来训练 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))

通常,每次您不想(或不能)为每个时期迭代整个数据集时,您都可以有一个 epoch_length(或等效)参数。

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

one epoch = one single pass (forward + backward) on all the training examples

按照这个通用定义,你的模型应该"see"所有的训练样本来宣告一个时期结束;然后下一个开始。在这种情况下,训练 n 个时期意味着模型看到每个训练示例 n 次。

然而,这并不总是可行/你想做的。

作为一个极端的例子,假设您正在使用合成数据训练您的模型,这些数据是由数据加载器即时生成的。在此设置中,您的训练数据几乎是无限的,因此没有 "iterating over all training examples" 的概念。一个时代将永远持续下去。在 epoch 结束时调用的任何回调(例如保存模型权重、计算指标)永远不会 运行.

为了解决这个问题,您可以在您的特定应用程序中人为地定义多个批次来分隔一个纪元。所以你可以说 epoch_length=1000,这意味着在对 1000 examples/batches 进行训练后,你认为这个纪元终止了,你开始一个新的纪元。通过这种方式,您可以决定在 epoch 结束时执行的每个操作(例如上面的回调、日志记录等)的执行粒度。