линейная регрессия pytorch при неверных результатах - PullRequest
0 голосов
/ 21 марта 2019

Я реализовал простую линейную регрессию, и у меня плохие результаты.Просто интересно, нормальны ли эти результаты, или я делаю какую-то ошибку.

Я пробовал разные оптимизаторы и скорости обучения, я всегда получаю плохие / плохие результаты

Вот мой код:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable 

class LinearRegressionPytorch(nn.Module):

   def __init__(self, input_dim=1, output_dim=1):

       super(LinearRegressionPytorch, self).__init__()
       self.linear = nn.Linear(input_dim, output_dim)

   def forward(self,x):
       x = x.view(x.size(0),-1)
       y = self.linear(x)
       return y

input_dim=1 
output_dim = 1
if torch.cuda.is_available():
   model = LinearRegressionPytorch(input_dim, output_dim).cuda()
else:
   model = LinearRegressionPytorch(input_dim, output_dim) 

criterium = nn.MSELoss()
l_rate =0.00001
optimizer = torch.optim.SGD(model.parameters(), lr=l_rate)
#optimizer = torch.optim.Adam(model.parameters(),lr=l_rate)
epochs = 100

#create data
x = np.random.uniform(0,10,size = 100) #np.linspace(0,10,100); 
y = 6*x+5
mu = 0
sigma = 5
noise =  np.random.normal(mu, sigma, len(y))
y_noise = y+noise

#pass it to pytorch
x_data = torch.from_numpy(x).float()
y_data = torch.from_numpy(y_noise).float()
if torch.cuda.is_available():
   inputs = Variable(x_data).cuda()
   target = Variable(y_data).cuda()
else:
   inputs = Variable(x_data)
   target = Variable(y_data)

for epoch in range(epochs):

   #predict data
   pred_y= model(inputs)

   #compute loss
   loss = criterium(pred_y, target)

   #zero grad and optimization
   optimizer.zero_grad()
   loss.backward()
   optimizer.step()

   #if epoch % 50 == 0:
   #   print(f'epoch = {epoch}, loss =  {loss.item()}')


#print params
for name, param in model.named_parameters():
   if param.requires_grad:
       print(name, param.data)

Есть плохие результаты:

linear.weight tensor([[1.7374]], device='cuda:0')
linear.bias tensor([0.1815], device='cuda:0')

Результатами должен быть вес = 6, смещение = 5

1 Ответ

1 голос
/ 21 марта 2019

Проблема Решение

На самом деле ваш batch_size проблематичен.Если вы установили его как единое целое, ваша target нуждается в той же форме, что и выходные данные (которые вы правильно изменяете с помощью view(-1, 1)).

Ваша потеря должна быть определена так:

loss = criterium(pred_y, target.view(-1, 1))

Эта сеть верна

Результаты

Ваши результаты не будут bias=5 (да, weight действительно пойдет к 6)поскольку вы добавляете случайный шум к target (и поскольку это единственное значение для всех ваших точек данных, будет затронуто только bias).

Если вы хотите, чтобы bias равнялось 5, удалитедобавление шума.

Вы также должны увеличить количество своих эпох, поскольку ваши данные довольно малы, а сеть (на самом деле линейная регрессия) не очень мощная. 10000 скажем, следуетвсе будет в порядке, и ваши потери должны колебаться в районе 0 (если вы измените шум на что-то заметное).

Шум

Вы создаете несколько гауссовых распределений с различными вариациями, поэтому ваша потеря будетвыше.Линейная регрессия не может вписаться в ваши данные и найти ощутимое смещение (поскольку оптимальный уклон для вашего шума все еще приблизительно равен 6, вы можете попытаться увеличить умножение с 5 до 1000 и посмотреть, что weight и bias будут изучены).

Стиль (немного оффтоп)

Пожалуйста, прочитайте документацию по PyTorch и обновляйте свой код (например, Variable устарела в пользу Tensor ипо праву так).

Эта часть кода:

x_data = torch.from_numpy(x).float()
y_data = torch.from_numpy(y_noise).float()
if torch.cuda.is_available():
    inputs = Tensor(x_data).cuda()
    target = Tensor(y_data).cuda()
else:
    inputs = Tensor(x_data)
    target = Tensor(y_data)

Можно написать кратко, как это (без долгих размышлений):

inputs = torch.from_numpy(x).float()
target = torch.from_numpy(y_noise).float()
if torch.cuda.is_available():
    inputs = inputs.cuda()
    target = target.cuda()

Я знаю, что глубокое обучение имеет репутацию плохогокод и фатальная практика, но пожалуйста не помогут распространить этот подход.

...