【问题标题】:pytorch linear regression given wrong resultspytorch 线性回归给出错误的结果
【发布时间】:2019-08-11 16:59:24
【问题描述】:

我实现了一个简单的线性回归,但得到了一些糟糕的结果。只是想知道这些结果是正常的还是我犯了一些错误。

我尝试了不同的优化器和学习率,我总是得到不好/差的结果

这是我的代码:

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')

结果应该是 weight = 6 ,bias = 5

【问题讨论】:

  • 欢迎来到 StackOverflow,请编辑您的问题,仅发布 Minimal, Complete and Verifiable Example。错误与您的绘图无关,为什么它在代码中?这只是在制造噪音,让其他人更难帮助你。

标签: linear-regression pytorch


【解决方案1】:

问题解决方案

其实你的batch_size 有问题。如果您将其设置为 1,则您的 target需要与输出相同的形状(正确地,您正在使用 view(-1, 1) 重塑形状)。

你的损失应该这样定义:

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

这个网络是正确的

结果

您的结果不会是 bias=5(是的,weight 确实会接近 6),因为您正在向 target 添加随机噪声(并且因为它是你所有的数据点,只有bias会受到影响)。

如果您希望 bias 等于 5,请删除添加的噪音。

你也应该增加你的 epoch 数量,因为你的数据非常小而且网络(实际上是线性回归)不是很强大。 10000 说应该没问题,你的损失应该围绕0 振荡(如果您将噪音更改为合理的东西)。

噪音

您正在创建具有不同变化的多个高斯分布,因此您的损失会更高。线性回归无法拟合您的数据并找到合理的偏差(因为您的噪声的最佳斜率仍然约为 6,您可以尝试将 5 的乘积增加到 1000 并查看 weight 和 @987654338 @将被学习)。

风格(有点离题)

请阅读有关 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()

我知道深度学习以糟糕的代码和致命的做法而闻名,但不要帮助传播这种方法。

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 2017-12-16
    • 2021-12-14
    • 2016-10-09
    • 2021-01-11
    • 2018-12-14
    • 2019-06-07
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多