【发布时间】:2018-06-25 23:37:31
【问题描述】:
我正在尝试使用 1 个特征进行简单的线性回归。这是一个简单的“根据多年经验预测薪水”的问题。
NN 以年经验 (X) 和薪水 (Y) 为基础进行培训。
由于某种原因,损失正在爆炸式增长并最终返回inf 或nan
这是我的代码:
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