一、手动计算梯度实现线性回归
#导入相关包
import torch as t
import matplotlib.pyplot as plt
#构造数据
def get_fake_data(batch_size = 8):
#设置随机种子数,这样每次生成的随机数都是一样的
t.manual_seed(10)
#产生随机数据:y = 2*x+3,加上了一些噪声
x = t.rand(batch_size,1) * 20
#randn生成期望为0方差为1的正态分布随机数
y = x * 2 + (1 + t.randn(batch_size,1)) * 3
return x,y
#查看生成数据的分布
x,y = get_fake_data()
plt.scatter(x.squeeze().numpy(),y.squeeze().numpy())
#线性回归
#随机初始化参数
w = t.rand(1,1)
b = t.zeros(1,1)
#学习率
lr = 0.001
for i in range(10000):
x,y = get_fake_data()
#forward:计算loss
y_pred = x.mm(w) + b.expand_as(y)
#均方误差作为损失函数
loss = 0.5 * (y_pred - y)**2
loss = loss.sum()
#backward:手动计算梯度
dloss = 1
dy_pred = dloss * (y_pred - y)
dw = x.t().mm(dy_pred)
db = dy_pred.sum()
#更新参数
w.sub_(lr * dw)
b.sub_(lr * db)
if