目录
前言
在b站发现的宝藏pytorch教程(链接在下方),做了一下老师留的课后习题分享一下,欢迎讨论。lhttps://www.bilibili.com/video/BV1hE411t7RN?from=search&seid=11711113722781934174&spm_id_from=333.337.0.0xx
代码分享
import torch
#数据集创建
x_data = [1.0,2.0,3.0,4.0]
y_data = [2.0,4.0,6.0,8.0]
#对参数进行初始化设定
w1 = torch.tensor([1.0])
w1.requires_grad = True
w2 = torch.tensor([1.0])
w2.requires_grad = True
b = torch.tensor([1.0])
b.requires_grad = True
def forward(x): #用于拟合的函数,题目规定为w1*(x**2)+w2*x+b
return w1 * (x ** 2) + w2 * x + b
def loss(x, y): #损失函数计算,同时这一步为计算图的生成
y_pred = forward(x)
return (y_pred - y) ** 2
print("before:", 5, forward(5).item())
print("before:", 100, forward(100).item())
print("before:", 1000, forward(1000).item())
print("before:", 10000, forward(10000).item())
#对模型进行训练,经验证,训练500000次大致能较好的拟合到x = 1000
for epoch in range(500000):
for x, y in zip(x_data,y_data):
l = loss(x, y) #前馈,计算loss、动态构建计算图的过程
l.backward() #反馈,将反向传播得到的偏导值保存在tensor变量中,并释放计算图
print("\tgrad:", x, y, w1.grad.item(), w2.grad.item(), b.grad.item())
w1.data, w2.data, b.data = w1.data - 0.005 * w1.grad.data, w2.data - 0.005 * w2.grad.data, b.data - 0.005 * b.grad.data #更新权重
#梯度清零
w1.grad.data.zero_()
w2.grad.data.zero_()
b.grad.data.zero_()
print("progress:", epoch, l.item())
print("after:", 5, forward(5).item())
print("after:", 100, forward(100).item())
print("after:", 1000, forward(1000).item())
print("after:", 10000, forward(10000).item())
print(w1.item(), w2.item(), b.item())
总结
1、刚开始学习率设置为0.01,结果训练下来无法拟合,调整到0.005后解决问题。
2、大概试了一下epoch为10000时能拟合到100,500000时能拟合到1000。
3、欢迎补充纠正。