Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么训练损失会上下波动?_Python_Tensorflow_Object Detection_Object Detection Api_Efficientnet - Fatal编程技术网

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

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所示,可以看

我将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()
阅读


在您的配置中,它声明您的批量大小为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()
阅读


你检测到的是哪种物体?这是三种不同的植物,我们有大约20k的训练照片。你检测到的是哪种物体?这是三种不同的植物,我们有大约20k的训练照片。我确实受到记忆的限制,-你能详细说明一下“梯度积累”吗?我添加了一些关于梯度积累和参考阅读的信息。我确实受记忆的限制,-你能详细说明一下“梯度积累”吗?我添加了一些关于梯度积累和参考阅读的信息。