前言
任务描述:给出一系列在平面的点,找出一条直线去拟合它。
参考来源:https://www.csdn.net/zhaohongfei_358/article/details/121418622,加入了更多的注释,便于理解
代码
工具:jupyter notebook
#导入相关库
import torch
import matplotlib.pyplot as plt
#as(简称)
#生成测试数据
x=torch.rand(100,1)*10
# 生成一个100行一列的数据;该数据服从[0,10]的uniform分布
x[:3]
#查看最后三行数据
y=3*x+10+torch.randn(100,1)*3#计算其对应的y值;y也是100行1列的
y[97:]
#查看97,98,99行的数据,100行不存在,因为下标从0开始
#绘制成散点图
plt.scatter(x.numpy(),y.numpy())
#x,y为tensor格式,需要转化为numpy格式
plt.show()
#定义网络模型
class LinearRegression(torch.nn.Module):
def __init__(self):#切记双下划线
super().__init__()
#初始化
#定义网络结构
self.linear =torch.nn.Linear(in_features=1,
out_features=1,
bias=True)
#线性层(输入维度,输出维度,是否偏置)
def forward(self,x):
#前向传播过程,x为输入
predict =self.linear(x)
return predict
#模型实例化
model=LinearRegression()
#随机梯度下降法(优化算法)
optimizer =torch.optim.SGD(model.parameters(),lr=1e-3)
#SGD(模型参数,超参数(学习率))
#查看模型参数(w,b)
for param in model.parameters():
print(param)
#定义损失函数
loss_function =torch.nn.MSELoss()
#开始训练模型
for epoch in range(10000):#训练1e4
#调用模型
predict_y =model(x)
#注意都是100维(100,1)
#计算损失(真实值和预测值的距离)
loss=loss_function(predict_y,y)
#反向传播,为更新权重做准备
loss.backward()
#更新权重
optimizer.step()
#清空之前的梯度,为下次迭代(第二个一万次)做准备
optimizer.zero_grad()
在这里插入for param in model.parameters(): # 因为模型有多个参数,所以model.parameters会返回一个可迭代的对象
print(param)
#查看训练效果(w,x),预测值和实际值接近代码片
#绘制效果图,加深印象
plt.scatter(x,y)
plt.plot(x,model(x).detach().numpy(),color='red')
#model(x)中带有梯度信息,直接转换会破坏计算图,detach()消除梯度信息
plt.show()