1. 手动实现线性回归
import torch
import numpy as np
import matplotlib.pyplot as plt
learning_rate = 0.01 # 学习率,例如w = w + w'*learning_rate
# 1 准备数据,真实数据x与y 准备参数
x = torch.rand([500, 1]) # 只要是rand就是几行几列的0或1的随机取值,除非用rndint指定范围取值的几行几列
y_true = 3 * x + 0.8 # 假设真实值时已知的,然后我们并不知道真实值,所以通过拟合得到一个接近的w与b
# 2 通过最先设置的w与b参与第一次计算y_predict
w = torch.rand([1, 1], requires_grad=True)
b = torch.tensor(0, requires_grad=True, dtype=torch.float32)
# 3 通过循环上千次步数,每次步数都逼近一次w与b,也就是更新w,b参数,倒数是通过反向传播求导得到,
for i in range(3000):
y_predict = torch.matmul(x, w) + b # 矩阵相乘
loss = (y_true - y_predict).pow(2).mean() # 计算loss函数,mean为均值
if w.grad is not None:
w.grad.data.zero_() # 对参数w与b的grad进行归零操作然后再反向传播
if b.grad is not None:
b.grad.data.zero_()
loss.backward() # 反向传播,得到w的倒数
w.data = w.data - learning_rate * w.grad #更新参数
b.data = b.data - learning_rate * b.grad
print("w ,b ,loss", w.item(), b.item(), loss.item(),i)
#真实数据用点红色-scatter(),预测数据用直线蓝色-plot()
plt.figure(figsize=(20,8))
plt.scatter(x,y_true,5,'r')
y_predict = torch.matmul(x, w) + b
plt.plot(x,y_predict.detach().numpy())
plt.show()
运行结果展示:
2. 线性回归进阶版
#线性回归进阶版
import torch
from torch import nn
from torch import optim
import numpy as np
from matplotlib import pyplot as plt
#1定义数据
x = torch.rand([500,1])
y_true = x*3 +0.8
#2定义模型
class Lr(nn.Module):
def __init__(self,intput_dim,output_dim): #输入输出数据维度
super(Lr,self).__init__()
self.linear = nn.Linear(intput_dim,output_dim)
def forward(self,x):
out = self.linear(x)
return out
intput_dim = 1
output_dim = 1
lerning_rate = 0.01
#3实例化模型
model = Lr(intput_dim,output_dim)
criterion = nn.MSELoss() #损失函数
optimizer = optim.SGD(model.parameters(),lr=lerning_rate) #优化器 lr就是学习率
#4训练模型
for i in range(4000):
y_predict = model(x) #获得预测值
loss = criterion(y_true,y_predict) #计算损失
optimizer.zero_grad() #梯度归零
loss.backward() #计算梯度
optimizer.step() #更新参数,此刻进行循环,切参数已经进入到model中
#5模型评估
#或model.train(False) #model.train(model=True) 表示设置模型为训练模式,可能会继续改变参数值
mode.eval() #mode.eval()或model.train(False) 表示设置模型为预测模式,不会继续改变参数值
plt.figure(figsize=(20,8))
plt.scatter(x,y_true,5,'r') #打印真实值,点类型
y_predict = model(x)
plt.plot(x,y_predict.detach().numpy()) #打印预测值,直线
plt.show()
运行结果展示: