Pytorch入门教程07-Pytorch实现完整线性回归

王 茂南 2020年10月6日07:55:20
评论
2269字阅读7分33秒
摘要在这一部分, 我们会首先说明使用Pytorch进行模型的定义, 使用nn.Linear来完成线性模型的定义, 再结合之前的损失函数和优化器, 给出一个完整的线性回归的例子

简介

在前面的例子中, 我们介绍了在Pytorch中的损失函数和优化器的使用. 但是还有一个可以改进的地方. 在前面的函数的定义中, 我们使用了forward函数, 自己定义了y=w*x. 但是实际上, Pytorch也是提供了模型的定义, 对于这种线性模型, 我们可以直接使用nn.Linear来进行定义.

在这一部分, 我们会首先说明使用Pytorch进行模型的定义, 再给出一个完整的线性回归的例子. 因为这一部分和之前的比较类似, 下面代码给出主要代码, 完整代码在github仓库中查看.

Github仓库链接简单线性回归

 

完整的线性回归例子

模型的建立

这里我们需要建立线性模型, 我们直接使用pytorch中的nn.Linear来完成模型的创建.

  1. class LinearRegression(nn.Module):
  2.     def __init__(self):
  3.         super(LinearRegression, self).__init__()
  4.         self.linear1 = nn.Linear(1, 1)
  5.     def forward(self, x):
  6.         x = self.linear1(x)
  7.         return x

在上面的自定义模型中, 有以下几个需要注意的点:

  • 自定的神经网络类必须继承 nn.Module.
  • 自定义类中需要实现__init__forward函数.
  • __init__: 定义网络的结构.
  • forward: 定义数据在模型中的传播路径.

接着我们初始化模型.

  1. # 模型初始化
  2. linearModel = LinearRegression()

 

定义损失函数和优化器

损失函数的定义和之前没有什么区别.

  1. loss = torch.nn.MSELoss() # 定义均方损失函数

在定义优化器时, 直接利用model.parameters()表示模型中所有需要求的权重. 这里主要就是参数传入的时候的区别, 其他的都是一样的.

  1. # 定义一个SGD优化器
  2. learning_rate = 0.001
  3. optimizer = torch.optim.SGD(linearModel.parameters(), lr=learning_rate)

 

模型的训练

最后一个步骤就是模型的训练. 这里有一个需要注意的是, 数据需要转换为2维的(这个是很重要的). 这里是100*1的大小, 表示有100个样本, 每一个样本是1维.

  1. X_tensor = torch.from_numpy(X).view(100,1)
  2. Y_tensor = torch.from_numpy(Y).view(100,1)

最后还是按照之前的步骤训练即可.

  1. n_iters = 101
  2. for epoch in range(n_iters):
  3.     y_pred = linearModel(X_tensor)
  4.     l = loss(Y_tensor, y_pred) # 求误差(注意这里的顺序)
  5.     l.backward() # 求梯度
  6.     optimizer.step()  # 更新权重,即向梯度方向走一步
  7.     optimizer.zero_grad() # 清空梯度
  8.     [w, b] = linearModel.parameters()  # 获得参数
  9.     if epoch % 20 == 0:
  10.         print(f'epoch {epoch+1}: w = {w.data}, loss = {l.item():.3f}')
  11. print(f'根据训练模型预测, 当x=5时, y的值为: {linearModel(torch.tensor([5.0]))}')
  12. """
  13. epoch 1: w = tensor([[0.8991]]), loss = 49.043
  14. epoch 21: w = tensor([[1.7334]]), loss = 3.314
  15. epoch 41: w = tensor([[1.9409]]), loss = 0.481
  16. epoch 61: w = tensor([[1.9924]]), loss = 0.305
  17. epoch 81: w = tensor([[2.0050]]), loss = 0.294
  18. epoch 101: w = tensor([[2.0080]]), loss = 0.294
  19. 根据训练模型预测, 当x=5时, y的值为: tensor([10.9290], grad_fn=<AddBackward0>)
  20. """

可以看到参数w正在逐渐朝2逼近.

 

结果可视化

最后, 我们将拟合出来的直线绘制出来即可.

  1. # 绘制预测曲线
  2. y_pre = linearModel(X_tensor).detach().numpy()
  3. fig = plt.figure(figsize=(12,8))
  4. ax = fig.add_subplot(1,1,1)
  5. ax.scatter(X,Y)
  6. ax.plot(X, y_pre, 'g-',  lw=3)
  7. fig.show()

最终的结果如下所示:

Pytorch入门教程07-Pytorch实现完整线性回归

 

Pytorch训练步骤总结

下面是使用Pytorch进行训练的一个完整的步骤:

  1. 利用 model(X) 进行正向传播。
  2. 利用 loss(Y, y_predicted) 计算模型损失。
  3. 利用 loss.backward() 计算模型梯度。
  4. 利用 optimizer.step() 更新权重。
  5. 利用 optimizer.zero_grad() 清空梯度。
  6. 重复 1-5 的操作。

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2020年10月6日07:55:20
  • 转载请务必保留本文链接:https://mathpretty.com/12516.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: