深度学习pytorch之线性回归实现

1.手工实现

import torch
from matplotlib import pyplot as plt

# 损失率:
learn_rate = 0.1
# 训练数据
x = torch.rand([500,1])
y = 3*x + 0.8

# 参数
w = torch.rand([1,1],requires_grad=True)
b = torch.tensor(0,requires_grad=True,dtype=torch.float32)

for i in range(500):
    # 预测值
    y_predict = torch.matmul(x,w) + b
    # 算出标准差
    loss = (y-y_predict).pow(2).mean()
    # 调用backward()函数之前都要将梯度清零,因为如果梯度不清零,pytorch中会将上次计算的梯度和本次计算的梯度累加
    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- learn_rate * w.grad
    b.data = b.data - learn_rate * b.grad
# 画图    
plt.figure(figsize=(20,8))
plt.scatter(x.numpy().reshape(-1),y.numpy().reshape(-1))
plt.plot(x.numpy().reshape(-1),y_predict.detach().numpy().reshape(-1),c="red")

2.torch api实现

import torch
from torch import nn
from torch import optim
from matplotlib import pyplot as plt
import numpy as np

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

# 定义模型
class Lr(nn.Module):
    def __init__(self):
        super(Lr,self).__init__()
        self.linear = nn.Linear(1,1)
    def forward(self,x):
        out = self.linear(x)
        return out
# 实例化模型,loss,优化器    
model = Lr()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(),lr=1e-3)
# 模型训练
for i in range(30000):
    out = model(x)            # 预测值
    loss = criterion(y,out)   # 损失
    optimizer.zero_grad()     # 梯度归零
    loss.backward()           # 计算梯度
    optimizer.step()          # 更新梯度

model.eval()                  # 设置模型为评估模式,即预测模式
predict = model(x)
predict = predict.data.numpy()
plt.scatter(x.data.numpy(),y.data.numpy(),c="r")
plt.plot(x.data.numpy(),predict)
plt.show()

  

posted @ 2022-10-05 14:52  NAVYSUMMER  阅读(46)  评论(0)    收藏  举报
交流群 编程书籍