Pytorch初学简单的线性模型代码实操

初学者学习Pytorch系列

第一篇 Pytorch初学简单的线性模型代码实操
第二篇 Pytorch实现逻辑斯蒂回归模型 代码实操


文章目录

  • 初学者学习Pytorch系列
  • 前言
  • 一、先上代码
  • 二、初学疑问和解释
    • 1.对Class理解不够
    • 2.代码y_pred = model(x_data)为什么直接对model传入参数就行,无需调用里面方法?
    • 3.criterion损失函数和optimizer优化器有什么关联?
  • 三、测试结果
  • 总结


前言

设计了两个最简单的数据集
x[1.0, 2.0, 3.0]
y[2.0, 4.0, 6.0]
构建的函数的函数y=wx+b


一、先上代码

代码如下(示例):

import torch

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

# 构架模型类
class LinearModel(torch.nn.Module):
    def __init__(self):  # init不要写错
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  # linear是类里面的一个对象,自己创建的

    def forward(self, x):  # forward被重写了
        y_pred = self.linear(x)
        return y_pred

# 实例化对象
model = LinearModel()

criterion = torch.nn.MSELoss(reduction='sum')  # 创建了损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 优化器更新权重函数

# 优化100for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)  # 计算损失
    print(epoch, loss.item())
    optimizer.zero_grad()  # 记得清零,否则会叠加
    loss.backward()  # 计算梯度,算出偏移的斜率等
    optimizer.step()  # 更新权重

# 输出优化后的w和b
print("w=", model.linear.weight.item())
print("b=", model.linear.bias.item())

x_test = torch.Tensor([[4.0]])  # 测试数据
y_test = model(x_test)  # 优化后预测的结果
print("y_test=", y_test.data)

二、初学疑问和解释

1.对Class理解不够

  1. 首先检查是否是Python语法学习得不够,然后在必要时查看源码。
  2. LinearModel是我们自己定义的类,继承于torch.nn.Module,Module是帮助我们实现深度学习的工具,所以在初始化的时候,需要调用父类的init方法去初始化一些基本的信息,例如传入参数的维度或输出参数的维度。
  3. forward是父类原本就有的方法,这里是进行了重写。

2.代码y_pred = model(x_data)为什么直接对model传入参数就行,无需调用里面方法?

直接调用是Python的一个经典语法,可调用对象,在对象父类里面有__call__()方法,我们传入参数后可以直接调用,而在Model中,打开源码会发现__call__方法中默认调用forward,而我们重写了forward,所以会调用到我们写的forward,返回forward函数的结果。

3.criterion损失函数和optimizer优化器有什么关联?

1.代码体现如下

criterion = torch.nn.MSELoss(reduction='sum')  # 创建了损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 优化器更新权重函数

(注:SGD全称Stochastic gradient descent,随机梯度下降算法)
两者的关联是通过Tensor进行简介关联的,Tensor中有两个变量,一个存放data值,一个是斜率grab值,在我们用损失函数去backward的时候,grab会被赋值,而optimizer这个优化器就是通过对grab的获取进行优化,所以才有联系。


三、测试结果

81轮开始展示
轮数 损失
81 0.021285690367221832
82 0.020979858934879303
83 0.020678268745541573
84 0.020381104201078415
85 0.020088236778974533
86 0.019799474626779556
87 0.019514989107847214
88 0.01923450268805027
89 0.018958041444420815
90 0.018685566261410713
91 0.018417105078697205
92 0.01815234124660492
93 0.017891472205519676
94 0.017634321004152298
95 0.017380956560373306
96 0.01713106781244278
97 0.016884924843907356
98 0.01664227619767189
99 0.016403062269091606
w= 2.085261821746826
b= -0.19382020831108093
y_test= tensor([[8.1472]])

预测的值有误差,可以将优化轮数改为1000,但是也不能改太大,否则会过拟合。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了pytorch实现线性回归的基本使用,而有许多问题我会在学习中继续补充。

你可能感兴趣的:(Pytorch,pytorch,python,深度学习)