为什么训练损失会上下波动?

时间:2021-03-05 12:03:50

标签: python tensorflow object-detection object-detection-api efficientnet

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

Tensorboard

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

Tensorboard smoothed

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

PS:我的训练 can be found herepipeline.config 文件。

1 个答案:

答案 0 :(得分:3)

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

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


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

通常,训练循环是这样的(我使用类似 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()

阅读