1

我正在使用 TF2 研究对象检测 API 和来自 TF2 模型动物园的预训练 EfficientDet D3 模型。在对我自己的数据集进行训练期间,我注意到总损失在上下跳跃 - 例如,几步之后从 0.5 到 2.0,然后又回到 0.75:

张量板

所以总而言之,这个训练似乎不是很稳定。我认为问题可能出在学习率上,但正如您在上面的图表中看到的,我在训练期间将 LR 设置为衰减,它下降到 1e-15 的非常小的值,所以我不知道如何这可能是问题所在(至少在培训的第二部分)。

Tensorboard 平滑

此外,当我在 Tensorboard 中平滑曲线时,如上图第二张所示,可以看到总损失在下降,因此方向是正确的,即使它仍然处于相当高的值。我会对为什么我的训练集不能取得更好的结果感兴趣,但我想这是另一个问题。首先,我真的很感兴趣,为什么在整个训练过程中总损失会如此上下波动。有任何想法吗?

PS:pipeline.config我的培训文件可以在这里找到

4

1 回答 1

3

在您的配置中,它声明您的批量大小为 2。这很小,会导致非常不稳定的损失。

尝试大幅增加批量大小;尝试256or的值512。如果您受到内存的限制,请尝试通过梯度累积来增加它。


梯度累积是通过组合来自较小 mini-batch 的反向传递来合成较大批次的过程。在更新模型的参数之前,您将运行多次反向传递。

通常,训练循环会这样(出于说明目的,我使用类似 pytorch 的语法):

for model_inputs, truths in iter_batches():
    predictions = model(model_inputs)
    loss = get_loss(predictions, truths)
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

通过梯度累积,您将通过几个批次然后更新模型。这模拟了一个更大的批量大小,而不需要内存一次实际放置一个大批量大小:

accumulations = 10

for i, (model_inputs, truths) in enumerate(iter_batches()):
    predictions = model(model_inputs)
    loss = get_loss(predictions, truths)
    loss.backward()
    if (i - 1) % accumulations == 0:
        optimizer.step()
        optimizer.zero_grad()

阅读

于 2021-03-05T15:10:57.713 回答