簡體   English   中英

pytorch和多項式線性回歸問題

[英]Pytorch and Polynomial Linear Regression issue

我已經修改了在Pytorch github上找到的代碼帽以適合我的數據,但是我的損失結果很大,每次迭代它們都會變得更大,后來變成nan.Code不會給我任何錯誤,公正也不會給我損失結果,並且預測。 我還有另一個處理簡單線性回歸的代碼,並且一切正常。 我想我這里缺少一些簡單的東西,但是我看不到它。 任何幫助,將不勝感激。

碼:

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]

9南

有幾件事導致了這個問題。 更改其中的一些或全部將為您提供合理的結果,並使學習成為可能。

  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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM