Python 为什么训练损失会上下波动?
我将TF2研究对象检测API与来自TF2模型动物园的预先训练的EfficientSet D3模型一起使用。在对我自己的数据集进行训练期间,我注意到总损失在上下跳跃——例如,几步后从0.5到2.0,然后返回到0.75: 因此,所有这些训练似乎都不是很稳定。我认为问题可能在于学习速度,但正如你在上面的图表中所看到的,我在训练期间将LR设置为衰减,它降到了一个非常小的值1e-15,因此我不认为这是问题所在(至少在训练的下半部分) 同样,当我在Tensorboard中平滑曲线时,如上图2所示,可以看到总损耗下降,因此方向是正确的,即使它仍然处于相当高的值上。我很想知道为什么我的训练不能取得更好的效果,但我想这是另一个问题。首先,我真的很感兴趣,为什么整个训练过程中总损失如此之大。有什么想法吗Python 为什么训练损失会上下波动?,python,tensorflow,object-detection,object-detection-api,efficientnet,Python,Tensorflow,Object Detection,Object Detection Api,Efficientnet,我将TF2研究对象检测API与来自TF2模型动物园的预先训练的EfficientSet D3模型一起使用。在对我自己的数据集进行训练期间,我注意到总损失在上下跳跃——例如,几步后从0.5到2.0,然后返回到0.75: 因此,所有这些训练似乎都不是很稳定。我认为问题可能在于学习速度,但正如你在上面的图表中所看到的,我在训练期间将LR设置为衰减,它降到了一个非常小的值1e-15,因此我不认为这是问题所在(至少在训练的下半部分) 同样,当我在Tensorboard中平滑曲线时,如上图2所示,可以看
PS:pipeline.config文件,用于我的培训。在您的配置中,它声明批处理大小为2。这很小,会造成非常不稳定的损失 试着大幅增加批量;请尝试将值设置为
256
或512
。如果你受到记忆的限制,试着通过梯度积累来增加记忆
梯度累积是通过组合较小的小批次的反向过程合成较大批次的过程。在更新模型参数之前,您将运行多个向后传递 通常,训练循环会这样(我使用类似pytorch的语法进行说明): 通过梯度累积,您将完成几个批次,然后更新模型。这将模拟更大的批处理大小,而不需要内存一次将较大的批处理大小全部放入:
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()
阅读
256
或512
。如果你受到记忆的限制,试着通过梯度积累来增加记忆
梯度累积是通过组合较小的小批次的反向过程合成较大批次的过程。在更新模型参数之前,您将运行多个向后传递 通常,训练循环会这样(我使用类似pytorch的语法进行说明): 通过梯度累积,您将完成几个批次,然后更新模型。这将模拟更大的批处理大小,而不需要内存一次将较大的批处理大小全部放入:
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()
阅读