【问题标题】:Pytorch loss inf nanPytorch 损失信息
【发布时间】:2018-06-25 23:37:31
【问题描述】:

我正在尝试使用 1 个特征进行简单的线性回归。这是一个简单的“根据多年经验预测薪水”的问题。 NN 以年经验 (X) 和薪水 (Y) 为基础进行培训。 由于某种原因,损失正在爆炸式增长并最终返回infnan

这是我的代码:

    import torch
    import torch.nn as nn
    import pandas as pd
    import numpy as np
    
    dataset = pd.read_csv('./salaries.csv')
    
    x_temp = dataset.iloc[:, :-1].values
    y_temp = dataset.iloc[:, 1:].values
    
    X_train = torch.FloatTensor(x_temp)
    Y_train = torch.FloatTensor(y_temp)
   
    class Model(torch.nn.Module): 
        def __init__(self):
            super().__init__()
            self.linear = torch.nn.Linear(1,1)
    
        def forward(self, x):
            y_pred = self.linear(x)
            return y_pred
    
    model = Model()
    
    loss_func = torch.nn.MSELoss(size_average=False)
    optim = torch.optim.SGD(model.parameters(), lr=0.01)
    
    #training 
    for epoch in range(200):
        #calculate y_pred
        y_pred = model(X_train)
    
        #calculate loss
        loss = loss_func(y_pred, Y_train)
        print(epoch, "{:.2f}".format(loss.data))
    
        #backward pass + update weights
        optim.zero_grad()
        loss.backward()
        optim.step()
    
    
    test_exp = torch.FloatTensor([[8.0]])
    print("8 years experience --> ", model(test_exp).data[0][0].item())

正如我所提到的,一旦开始训练,损失就会变得非常大,并在第 10 个 epoch 之后显示inf

我怀疑这可能与我加载数据的方式有关?这是salaries.csv 文件中的内容:

Years Salary
1.1 39343
1.3 46205
1.5 37731
2   43525
2.2 39891
2.9 56642
3   60150
3.2 54445
3.2 64445
3.7 57189
3.9 63218
4   55794
4   56957
4.1 57081
4.5 61111
4.9 67938
5.1 66029
5.3 83088

感谢您的帮助

【问题讨论】:

  • 你的数据集中有 NaN 或 inf 吗?
  • 你能把工资 csv 的链接贴出来吗?
  • 我将从获得平均损失开始,而不是总和(为什么不首先避免平均?)。和/或降低学习率。最后,您可以通过缩小输出值来使问题对 MSE 更敏感(我建议使用 10 000 的因子,因此这些值保持可读性)。

标签: regression pytorch


【解决方案1】:

一旦损失在某次通过后变为 inf,您的模型在反向传播后就会损坏。这可能是因为“薪水”列中的值太大。尝试使工资正常化。

或者,您可以尝试手动初始化参数(而不是让它随机初始化),让偏差项为工资的平均值,并且线的斜率为 0(例如)。这样一来,初始模型将足够接近最优解,因此损失不会扩大。

【讨论】:

    【解决方案2】:

    以下是这一切如何发生的示例。你可以尝试运行这个基本上代表r-deep layer network的程序。

    import torch
    import math
    import matplotlib.pyplot as plt
    def stat(t, p=True):
        m = t.mean()
        s = t.std()
        if p==True:
            print(f"MEAN: {m}, STD: {s}")
        return(m,s)
    
    _m = []
    _s = []
    
    c = 100
    r = 50# repeat steps
    x = torch.randn(c)
    m = torch.randn(c,c)#/math.sqrt(n)
    stat(x)
    
    for _ in range (0,r):
        x = m@x    
        _1, _2 = stat(x, False)
        _m.append(_1)
        _s.append(_2)
    
    
    stat(x)
    
    plt.plot(_m)
    plt.plot(_s)
    plt.legend(["mean","std"])
    plt.show()
    

    【讨论】:

      【解决方案3】:

      请将学习率“lr”降低到 0.001 或 0.0001。具有较大的 lr 值会使梯度爆炸并导致 inf。我已经尝试过 lr=0.001 和 lr=0.0001 对我来说效果很好。请尝试一次,然后告诉我。

      【讨论】:

        【解决方案4】:

        获得nan 损失的另一种可能性是包含nan 值的模型的输入张量。尝试从模型输入中过滤 nan 值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 2020-10-29
          • 2022-01-15
          • 1970-01-01
          • 2019-03-20
          • 2023-04-09
          • 2020-10-05
          相关资源
          最近更新 更多