📜  使用PyTorch进行线性回归

📅  最后修改于: 2021-04-16 09:18:01             🧑  作者: Mango

线性回归是一种非常常用的统计方法,它使我们能够确定和研究两个连续变量之间的关系。前面已经在本文中介绍了线性回归的各种属性及其Python实现。现在,我们将了解如何在PyTorch中实现这一点,PyTorch是Facebook正在开发的一种非常流行的深度学习库。

首先,您需要将PyTorch安装到您的Python环境中。最简单的方法是使用pipconda工具。访问pytorch.org并安装您想要使用的Python解释器和程序包管理器的版本。

# We can run this Python code on a Jupyter notebook
# to automatically install the correct version of 
# PyTorch.
  
# http://pytorch.org / from os import path
from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag
platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag())
  
accelerator = 'cu80' if path.exists('/opt / bin / nvidia-smi') else 'cpu'
  
! pip install -q http://download.pytorch.org / whl/{accelerator}/torch-1.3.1.post4-{platform}-linux_x86_64.whl torchvision

安装了PyTorch之后,现在让我们看一下代码。
编写以下两行,以导入必要的库函数和对象。

import torch
from torch.autograd import Variable

我们还定义了一些数据,并将它们分配给变量x_datay_data ,如下所示:

x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]]))
y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))

在这里, x_data是我们的自变量, y_data是我们的因变量。这将是我们目前的数据集。接下来,我们需要定义我们的模型。定义我们的模型有两个主要步骤。他们是:

  1. 初始化我们的模型。
  2. 声明前传。

我们使用下面给出的类:

class LinearRegressionModel(torch.nn.Module):
  
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  # One in and one out
  
    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

如您所见,我们的Model类是torch.nn.module的子类。另外,由于这里只有一个输入和一个输出,因此我们使用线性模型,其输入和输出维数均为1。

接下来,我们创建此模型的对象。

# our model
our_model = LinearRegressionModel()

此后,我们选择优化器和损失准则。在这里,我们将使用均方误差(MSE)作为我们的损失函数,并使用随机梯度下降(SGD)作为我们的优化器。另外,我们任意地将学习率固定为0.01。

criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(our_model.parameters(), lr = 0.01)

现在,我们进入培训步骤。在培训期间,我们执行了500次以下任务:

  1. 通过传递数据并找出y的预测值来执行前向传递。
  2. 使用MSE计算损失。
  3. 将所有梯度重置为0,执行反向传播,然后更新权重。
for epoch in range(500):
  
    # Forward pass: Compute predicted y by passing 
    # x to the model
    pred_y = our_model(x_data)
  
    # Compute and print loss
    loss = criterion(pred_y, y_data)
  
    # Zero gradients, perform a backward pass, 
    # and update the weights.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print('epoch {}, loss {}'.format(epoch, loss.item()))

培训完成后,我们将使用定义的模型测试是否获得了正确的结果。因此,我们针对x_data的未知值(在本例中为4.0)对其进行测试。

new_var = Variable(torch.Tensor([[4.0]]))
pred_y = our_model(new_var)
print("predict (after training)", 4, our_model(new_var).item())

如果正确执行了所有步骤,则将看到输入4.0的值非常接近8.0,如下所示。因此,我们的模型从本质上学习了输入数据和输出数据之间的关系,而无需进行显式编程。

predict (after training) 4 7.966438293457031

供您参考,您可以在下面找到本文的完整代码:

import torch
from torch.autograd import Variable
  
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]]))
y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))
  
  
class LinearRegressionModel(torch.nn.Module):
  
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  # One in and one out
  
    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred
  
# our model
our_model = LinearRegressionModel()
  
criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(our_model.parameters(), lr = 0.01)
  
for epoch in range(500):
  
    # Forward pass: Compute predicted y by passing 
    # x to the model
    pred_y = our_model(x_data)
  
    # Compute and print loss
    loss = criterion(pred_y, y_data)
  
    # Zero gradients, perform a backward pass, 
    # and update the weights.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print('epoch {}, loss {}'.format(epoch, loss.item()))
  
new_var = Variable(torch.Tensor([[4.0]]))
pred_y = our_model(new_var)
print("predict (after training)", 4, our_model(new_var).item())

参考

  • PyTorchZeroToAll
  • 宾夕法尼亚州立STAT 501