PyTorch深度学习实践 第五讲---实现线性回归

Demo 5:Pytorch实现线性回归 (开始用框架啦)
来源:B站 刘二大人 点击这里跳转

PyTorch 基本流程Fashion(风格)

  1. 数据集准备(包括预处理):prepare dataset
  2. 模型设计:design model using Class # 目的是为了前向传播forward,即计算y hat(预测值)
  3. 构造损失函数和优化器:Construct loss and optimizer (using PyTorch API) # 计算loss是为了进行反向传播,optimizer是为了更新梯度。
  4. 训练迭代: Training cycle (自动实现forward,backward,update)

简单线性回归实现:

#     使用pytorch实现线性回归

import torch

# prepare dataset
x_data = torch.tensor([[1.0], [2.0], [3.0]])
y_data = torch.tensor([[2.0], [4.0], [6.0]])

# design model (using class)
'''
pytorch中,定义模型类都需要继承nn.Module,这个模块是所有神经网络的基类
在模型类中,__init__() 和 forward() 是需要自己实现的,backward()直接调用就行
线性模型wx+b,需要w和b两个数据,和之前一样,在torch中定义为tensor
pytorch框架内部自动使用__call()__方法调用forward()函数,__call__称为魔法函数,我们是见不到的
'''


class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        # 下面函数的(1,1)表示输入x,和输出y的特征都是1维的
        # nn。Module类中的nn.Lnnear()方法中自动封装了w和b参数,要获取直接用linear.weight和linear.bias
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred


model = LinearModel()

# construct loss and optimizer
'''
损失函数和用什么梯度下降法(也就是经常会听到的优化器)都在torch中封装好了,直接调用即可
MSELoss:均方误差损失函数
SGD:随机梯度下降法优化器,注意,在本例中SGD不表示随机梯度下降哦,因为输入是一批数据,所以是批量梯度下降
'''
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # model.parameters表示自动完成初始化操作

# training cycle (forward,backward,update)
'''
本例中可以很方便看到,pytorch框架帮助我们省略了多少步骤,backward和update具体内容都不需要自己写了
'''
for epoch in range(100):
    y_pred = model(x_data)  # 这句语句会调用模型的call方法,去自动执行forward计算y_pred
    loss = criterion(y_pred, y_data)  # MSELoss 计算损失
    print(epoch, loss.item())  # 每个epoch的loss是多少

    optimizer.zero_grad()  # 梯清零,不然就累加了
    loss.backward()  # 对损失函数做一次反向传播,直接就计算梯度啦
    optimizer.step()  # 自动更新参数

print('w = ', model.linear.weight.item())  # 取w
print('b = ', model.linear.bias.item())  # 取b

# 现在来预测一下
x_test = torch.tensor([[4.0]])
y_test = model(x_test)

print('y_pred', y_test.data)

说明:

  1. Module内置魔法函数__call__(),里面有一条调用forward()的语句。因此新写的类中需要重写forward()覆盖掉父类中的forward()
  2. call函数的另一个作用是可以直接在实例后面的()加数据,例如下面3中的代码中括号内容,实例化的model对象,和实例化的linear对象
  3. 本算法的forward体现是通过以下语句实现的: 实现原理1中写啦
y_pred = model(x_data) 
  1. 代码中的self.linear(x)也由魔法函数call()调用torch.nn.Linear类中的forward(),自动执行y= wx + b。
  2. 关于魔法函数call在PyTorch中的应用的进一步解释:
    pytorch 之 call, init,forward
    pytorch系列nn.Modlue中call的进一步解释
  3. 每一次epoch的训练过程,总结就是
    ①前向传播,求y hat (输入的预测值)
    ②根据y_hat和y_label(y_data)计算loss
    ③反向传播 backward (计算梯度)
    ④根据梯度,更新参数
  4. 本实例是批量数据处理,不要被optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)误导了,以为见了SGD就是随机梯度下降。梯度下降算法使用的是随机梯度下降,还是批量梯度下降,还是mini-batch梯度下降,用的API都是 torch.optim.SGD。 具体用哪个要看传进来的数据是单个的还是批量的。这里传进来的是批量数据,所以SGD不是随机梯度下降,而是批量梯度下降。
  5. torch.nn.MSELoss也跟torch.nn.Module有关,参与计算图的构建,torch.optim.SGD与torch.nn.Module无关,不参与构建计算图。
  6. 传送门 torch.nn.Linear的pytorch文档

你可能感兴趣的:(Pytorch框架实践,线性回归,深度学习,python)