【问题标题】:Pytorch - Repeating LossPytorch - 重复损失
【发布时间】:2021-07-25 08:36:02
【问题描述】:

我是 PyTorch 的新手,在显示模型丢失时发现了一个问题。 Pytorch Adam Optimizer - Model Loss Figure

Pytorch SGD Optimizer - Model Loss Figure

如您所见,模型似乎多次上升和下降,并具有循环模式(该模式在每个 epoch 开始时开始重复)。

完整代码见:https://github.com/19valentin99/Kaggle/tree/main/Iris%20Flowers 在 main_test.py 中(# 行是我用来调试代码的行,答案应该在下面)。

【问题讨论】:

    标签: pytorch repeat loss


    【解决方案1】:

    当我们只考虑最后一个元素的损失(或超过 整个时期)我们将看到损失平稳减少

    您的损失是平滑的,因为您在每次迭代中都在查看完全相同批次的损失。事实上,您的 train data loader 并没有改变您的实例:

    train2 = DataLoader(flowers_data_train, batch_size=BATCH_SIZE)
    

    这意味着同一批次​​将在每个时期最后出现。就是这样,这并不意味着学习不同,这意味着您正在查看完整数据集损失的一部分。

    【讨论】:

      【解决方案2】:

      “不工作”和“工作”之间的区别在于记录损失的时间。
      这个想法是:总的来说,损失会收敛,但是在收敛之前,它会上下跳跃。 当它上下跳跃时,如果我们采样太频繁,我们可能会看到一个模式。该模式由我们用于训练的数据给出(因为我们用于训练的数据在每个时期都是相同的 - 分批)。

      结果: 对于不工作的版本:我记录了每个时期的损失,每批之后。
      对于工作版本:我只记录了该时代的最新损失。

      Pytorch Adam Optimizer - Model Loss (working)

      Pytorch SGD Optimizer - Model Loss (working)

      此外,我将附上生成非工作版本的代码:

      loss_list = []
      for epoch in range(EPOCHS):
          for idx, (x, y) in enumerate(train_load):
              x, y = x.to(device), y.to(device)
              #Compute Error
              prediction = model(x)
              #print(prediction, y)
              loss = loss_fn(prediction, y)
      
              #debuging
              loss_list.append(loss.item())
      
              ##Backpropagation
              optimizer.zero_grad()
              loss.backward()
              optimizer.step()
      
      
      plt.plot(loss_list)
      plt.show()

      工作代码:

      loss_list2 = np.zeros((EPOCHS,))
      for epoch in range(EPOCHS):
          for batch, (x, y) in enumerate(train_load):
              x = x.to(device=device)
              y = y.to(device=device)
              y_pred = model(x)
              loss = loss_fn(y_pred, y)
              loss_list2[epoch] = loss.item()
      
              # Zero gradients
              optimizer.zero_grad()
              loss.backward()
              optimizer.step()
          
          
      
      
      plt.plot(loss_list2)
      plt.show()

      最后,我想提一下,我知道还有其他几个线程说明了如何解决这个问题(例如:剪辑渐变,删除最后一批,模型太简单而无法捕获数据),但最后,我发现这实际上不是问题,而是更多“当数据记录完成时”。

      我希望这对其他人也有帮助。

      【讨论】:

      • 所以你的意思是:用loss_list2[epoch] = loss.item() 替换loss_list.append(loss.item()) 使代码“工作”?您在链接中提供的代码无法运行...
      • 提供的代码是“部分”,它区分了平滑损失和看起来随机的损失。通过该代码,我想说明当在每个 bach 之后捕获损失时,我们将得到不均匀的损失(它以重复的模式上下波动)。
      • 当我们只考虑最后一个元素的损失(或整个时期的损失)时,我们会看到损失平稳减少。
      猜你喜欢
      • 1970-01-01
      • 2021-08-25
      • 2020-10-29
      • 2022-01-15
      • 1970-01-01
      • 2019-05-28
      • 2022-01-18
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多