Demo 5:Pytorch实现线性回归 (开始用框架啦)
来源:B站 刘二大人 点击这里跳转
PyTorch 基本流程Fashion(风格)
- 数据集准备(包括预处理):prepare dataset
- 模型设计:design model using Class # 目的是为了前向传播forward,即计算y hat(预测值)
- 构造损失函数和优化器:Construct loss and optimizer (using PyTorch API) # 计算loss是为了进行反向传播,optimizer是为了更新梯度。
- 训练迭代: 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)
说明:
- Module内置魔法函数__call__(),里面有一条调用forward()的语句。因此新写的类中需要重写forward()覆盖掉父类中的forward()
- call函数的另一个作用是可以直接在实例后面的()加数据,例如下面3中的代码中括号内容,实例化的model对象,和实例化的linear对象
- 本算法的forward体现是通过以下语句实现的: 实现原理1中写啦
y_pred = model(x_data)
- 代码中的self.linear(x)也由魔法函数call()调用torch.nn.Linear类中的forward(),自动执行y= wx + b。
- 关于魔法函数call在PyTorch中的应用的进一步解释:
pytorch 之 call, init,forward
pytorch系列nn.Modlue中call的进一步解释 - 每一次epoch的训练过程,总结就是
①前向传播,求y hat (输入的预测值)
②根据y_hat和y_label(y_data)计算loss
③反向传播 backward (计算梯度)
④根据梯度,更新参数 - 本实例是批量数据处理,不要被optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)误导了,以为见了SGD就是随机梯度下降。梯度下降算法使用的是随机梯度下降,还是批量梯度下降,还是mini-batch梯度下降,用的API都是 torch.optim.SGD。 具体用哪个要看传进来的数据是单个的还是批量的。这里传进来的是批量数据,所以SGD不是随机梯度下降,而是批量梯度下降。
- torch.nn.MSELoss也跟torch.nn.Module有关,参与计算图的构建,torch.optim.SGD与torch.nn.Module无关,不参与构建计算图。
- 传送门 torch.nn.Linear的pytorch文档