PyTorch学习笔记——(5)手动实现线性回归 和 利用pytorch实现线性回归

目录

  • 1、问题描述:
  • 2、手动实现线性回归:
  • 3、pytorch实现线性回归:
  • 4、注意:

1、问题描述:

给定一组特征数据 x x x和标签数据 y y y,利用 y = w ∗ x + b y=w*x+b y=wx+b线性模型,求出 w w w b b b的值。
其实就是个单层感知机,实现思路是:(1)准备数据;(2)随机初始化参数 w w w b b b;(3)然后计算损失loss;(4)通过循环、反向传播、更新参数;(5)测试模型;(6)可视化预测结果和真实结果。

2、手动实现线性回归:

import torch
import matplotlib.pyplot as plt
lr = 0.01

# 1、准备数据
# y = 3*x + 0.8
x = torch.rand([500, 1])
y_true = 3 * x + 0.8

# 2、通过模型计算y_predict
w = torch.rand([1, 1], requires_grad=True)
b = torch.tensor(0, requires_grad=True, dtype=torch.float32)


# 4、通过循环、反向传播、更新参数
for i in range(500):
    # 3、计算loss
    y_predict = torch.matmul(x, w) + b
    loss = (y_predict - y_true).pow(2).mean()

    if w.grad is not None: # 防止梯度叠加
        w.grad.data.zero_()
    if b.grad is not None:
        b.grad.data.zero_()

    loss.backward() # 反向传播 求梯度
    w.data = w.data - lr * w.grad # 更新参数
    b.data = b.data - lr * b.grad
    if i % 10 == 0:
        print("w, b, loss", w.item(), b.item(), loss.item())

# 可视化
plt.figure(figsize=(20, 8))
plt.scatter(x.numpy().reshape(-1), y_true.numpy().reshape(-1), )
plt.plot(x.numpy().reshape(-1), y_predict.detach().numpy().reshape(-1))
plt.show()

可视化结果:
PyTorch学习笔记——(5)手动实现线性回归 和 利用pytorch实现线性回归_第1张图片

3、pytorch实现线性回归:

import torch
from torch import nn
from torch import optim
import matplotlib.pyplot as plt

# 1、定义数据
# y = 3*x + 0.8
x = torch.rand([500, 1])
y_true = 3 * x + 0.8

# 2、定义模型
class Linear(nn.Module):
    def __init__(self):
        super(Linear, self).__init__() # 继承父类的所有属性
        self.linear = nn.Linear(1, 1) # 送入的是特征数

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

# 实例化模型,loss,优化器
model = Linear()
criterion = nn.MSELoss() # 均方根误差
optimizer = optim.SGD(model.parameters(), lr=1e-3) # 优化器


# 3、训练模型
for epoch in range(5000):
    out = model(x) # 获取预测值
    loss = criterion(out, y_true) # 计算损失
    optimizer.zero_grad() # 梯度归零
    loss.backward() # 计算梯度
    optimizer.step() # 更新梯度
    if (epoch+1) % 100 == 0:
        print(f'epoch:{epoch}, loss:{loss.item()}')


# 4、模型评估
model.eval() # 设置模型为评估模式,即预测模式
predict = model(x)

# 可视化
predict = predict.data.numpy()
plt.scatter(x.data.numpy(), y_true.data.numpy(), c='r')
plt.plot(x.data.numpy(), predict)
plt.show()

可视化结果:
PyTorch学习笔记——(5)手动实现线性回归 和 利用pytorch实现线性回归_第2张图片

4、注意:

在利用pytorch实现模型时,一定记得每次训练,参数的梯度一定要清零,不然会叠加。

下面再记录一下.data.detach().item()的区别和联系

  • (1).data:就是只取这个张量,而忽略掉这个张量里的梯度。而且这个是浅拷贝,也就是说当我们x.data的时候,如果改变x.data,那原始的x数值也会改变;
  • (2).detach():和x.data一个作用,也是返回x张量的数值,而使require s_grad = False,只不过是深拷贝,也就是说重新创建了个张量;
  • (3).item():得到一个元素张量里面的元素值(只有一个元素才能使用)。

你可能感兴趣的:(PyTorch)