gpt4 book ai didi

python - Pytorch和多项式线性回归问题

转载 作者:行者123 更新时间:2023-11-30 09:00:18 25 4
gpt4 key购买 nike

我修改了在 Pytorch github 上找到的代码帽以适合我的数据,但是我的损失结果很大,并且每次迭代它们都会变得更大,然后变成 nan。代码不会给我任何错误,只是不会给我带来损失结果,没有预测。我有另一个处理简单线性回归的代码,一切正常。我想我在这里错过了一些简单的东西,但我看不到它。任何帮助将不胜感激。

代码:

import sklearn.linear_model as lm
from sklearn.preprocessing import PolynomialFeatures
import torch
import torch.autograd
import torch.nn.functional as F
from torch.autograd import Variable


train_data = torch.Tensor([
[40, 6, 4],
[44, 10, 4],
[46, 12, 5],
[48, 14, 7],
[52, 16, 9],
[58, 18, 12],
[60, 22, 14],
[68, 24, 20],
[74, 26, 21],
[80, 32, 24]])
test_data = torch.Tensor([
[6, 4],
[10, 5],
[4, 8]])

x_train = train_data[:,1:3]
y_train = train_data[:,0]

POLY_DEGREE = 3
input_size = 2
output_size = 1

poly = PolynomialFeatures(input_size * POLY_DEGREE, include_bias=False)
x_train_poly = poly.fit_transform(x_train.numpy())


class Model(torch.nn.Module):

def __init__(self):
super(Model, self).__init__()
self.fc = torch.nn.Linear(poly.n_output_features_, output_size)

def forward(self, x):
return self.fc(x)

model = Model()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)

losses = []

for i in range(10):
optimizer.zero_grad()
outputs = model(Variable(torch.Tensor(x_train_poly)))
print(outputs)
loss = criterion(outputs, Variable(y_train))
print(loss.data[0])
losses.append(loss.data[0])
loss.backward()
optimizer.step()
if loss.data[0] < 1e-4:
break

print('n_iter', i)
print(loss.data[0])
plt.plot(losses)
plt.show()

输出:

[393494300459008.0, inf, inf, inf, nan, nan, nan, nan, nan, nan]

n_iter

9 nan

最佳答案

有几个因素导致了这个问题。改变其中的部分或全部会给你带来合理的结果并使学习成为可能。

  1. 您的一些(多项式)特征具有巨大的方差并且具有非常大的值。查看np.max(x_train_poly)。当权重矩阵被随机初始化时,这会导致初始预测很大程度上偏离,并且损失很快接近无穷大。为了解决这个问题,您可能需要首先标准化您的特征(即,使每个特征的平均值为 0,方差为 1)。请注意,在非常深的网络中,使用类似的想法,称为“批量归一化”。如果您有兴趣,可以在这里阅读更多内容:https://arxiv.org/abs/1502.03167您可以执行以下操作来修复您的示例:

    means = np.mean(x_train_poly,axis=0,keepdims=True)
    std = np.std(x_train_poly,axis=0,keepdims=True)
    x_train_poly = (x_train_poly - means) / std
  2. 您当前的模型没有任何隐藏层,这是神经网络和构建非线性回归器/分类器的要点。您现在正在做的是将线性变换应用于 27 个输入特征,以获得接近输出的结果。您可以添加一个附加层,如下所示:

    hidden_dim = 50

    class Model(torch.nn.Module):
    def __init__(self):
    super(Model, self).__init__()
    self.layer1 = torch.nn.Linear(poly.n_output_features_, hidden_dim)
    self.layer2 = torch.nn.Linear(hidden_dim, output_size)

    def forward(self, x):
    return self.layer2(torch.nn.ReLU()(self.layer1(x)))

    请注意,我在第一个线性变换后添加了非线性,因为否则没有多层的意义。

  3. 初始预测的问题在开始时就存在很大偏差并导致损失接近无穷大。您使用的是平方损失,这实际上使损失函数中初始“错误”的数量级增加了一倍。一旦损失无穷大,您将无法逃脱,因为当您使用平方损失时,梯度更新本质上也是无穷大。有时有用的简单修复方法是使用平滑的 L1 损失。本质上是区间 [0, 1] 上的 MSE 和该区间之外的 L1 损失。更改以下内容:

    criterion = torch.nn.SmoothL1Loss()
  4. 这已经让你得到了一些明智的东西(即不再有 infs),但现在考虑调整学习率并引入weight_decay。您可能还想更改优化器。一些可行的建议:

    optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=1)
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=0.1)

关于python - Pytorch和多项式线性回归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42795226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com