我们使用一个自定义的数据,来使用torch实现一个简单的线性回归。假设我们的基础模型就是,其中,是参数,我们使用来构造数据,,所以最后通过模型应该能够得出的应该是分别接近3和0.8。
1、准备数据
根据创建函数
x = torch.rand([500,1])#创建一个500行1列的数据
y_true = x * 3 + 0.8
2、通过模型构建y_predict
因为需要反向计算梯度,所以将requires_grad设置为True
w = torch.rand([1,1],requires_grad = True)
b = torch.tensor(0,requires_grad = True)
y_predict = torch.matmul(x,w) + b
3、计算loss
loss = (y_true - y_predict).pow(2).mean()
4、通过循环,反向传播,更新参数
因为每一次计算,都应算出y_predict和loss,所以应该将其放进for循环中。
for i in range(5000):#不能直接用int进行迭代,而必须加个range
y_predict = torch.matmul(x,w) + b
loss = (y_true - y_predict).pow(2).mean()
if w.grad is not None:#w.grad是累加值,所以应该先判断是否有值
w.data.zero_()#_表示就地修改。
if b.grad is not None:
b.data.zero_()
loss.backward()
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())
5、运行结果
如果想要结果更加可视化,则可以引入matplotlib.pyplot。
import matplotlib.pyplot as plt
plt.figure(figsize = (10,4))
plt.scatter(x.numpy().reshape(-1),y_true.numpy().reshape(-1))#画散点图,resahpe(-1)用来转换为一阶
y_predict = torch.matmul(x,w) + b
plt.plot(x.numpy().reshape(-1),y_predict.detach().numpy().reshape(-1),c = 'r')#因为y_predict中会含有grad一些所以detach,c表示颜色color
plt.show()