PyTorch深度学习:用PyTorch实现线性回归

课程来源:Bilibili 刘二大人《用PyTorch实现线性回归》

代码大致思路:

铺垫:

  • 创建数据集、构建计算模型

  • 定义损失函数和优化方式

训练:

  • 通过forward函数进行前馈
  • loss记录损失值
  • 清除上一次的梯度值
  • 反向传播并记录梯度值grad
  • 借助梯度值更新权重
  • 循环上述过程

测试:

  • 检测最终权重值是否符合预期

笔记

  • 数据集为矩阵,3行1列,行数为样本个数,列数为该样本特征值数量
  • __call__函数可以实现类对象的函数化,使对象可加直接()调用__call__函数的函数体。

如代码中的:

y_pred = self.linear(x)  # 生成预测y值
y_pred = model(x_data)  # 调用forward函数
  • 在PyTorch在nn.Module类中实现了__call__方法,并在__call__方法中调用了forward函数,因此在新建的模型中必须重写forward函数。
  • 由于是loss.backward()函数执行之后,grad值才开始更新,所以其应该写在optimizer.zero_grad()函数之后。
  • torch中的其他优化器torch.optim.Adagradtorch.optim.Adam、torch.optim.Adamax、torch.optim.ASGD、torch.optim.LBFGS、torch.optim.RMSprop、torch.optim.Rprop、torch.optim.SGD...
  • (补充)定义函数时参数用*args或**kwargs含义:*args指传参过程中个数可变的位置形参,所有参数用名为args的元组接受。**kwargs指传参过程中个数可变的关键字形参,所有参数用名为kwargs的字典接受。

例子:

def function1(a, b, c, x = 4, y = 5)
    pass

function1(1, 2, 3, x = 4, y = 5)  # 正常调用

def function2(*args, **kwargs)  #使用不定长参数
    print(args)
    print(kwargs)

function2(1, 2, 3, x = 4, y = 5)  # 调用并输出

输出结果:

PyTorch深度学习:用PyTorch实现线性回归_第1张图片

 

完整代码:

import torch

x_data = torch.Tensor([[1.], [2.], [3.]])  # 建立数据集 3 x 1 矩阵数据集实现mini-batch
y_data = torch.Tensor([[2.], [4.], [6.]])


class LinearModel(torch.nn.Module):  # 继承自Module,类中必须包含__init__和forward函数
    def __init__(self):
        super().__init__()  # Don't care about it,just do it
        self.linear = torch.nn.Linear(1, 1)  # 包含两个权重的对象w和b,(1, 1)即对权重的赋初值

    def forward(self, x):
        y_pred = self.linear(x)  # 生成预测y值
        return y_pred


model = LinearModel()  # 实例化模型

criterion = torch.nn.MSELoss(size_average=False)  # 损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 更新权重

for epoch in range(1000):  # 开始训练
    y_pred = model(x_data)  # 调用forward函数
    loss = criterion(y_pred, y_data)  #记录loss损失值
    print(epoch, loss.item())

    optimizer.zero_grad()  # 清除上一次的梯度值
    loss.backward()  # 开始反向传播并写入梯度值
    optimizer.step()  # 通过梯度值对权重进行更新

print("w = ", model.linear.weight.item())
print("b = ", model.linear.bias.item())

x_test = torch.Tensor([4.])
y_test = model(x_test)  # 测试:用训练完成的权重进行预测
print("y_pred = ", y_test.data.item())

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