import torch
import matplotlib.pyplot as plt
l_r = 0.05
x = torch.rand(20, 1) * 10
print('x ',x)
y = 2*x + (5 + torch.randn(20,1))
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1),requires_grad=True)
for epoch in range(1000):
wx = w * x
y_pred = wx + b
print('y_pred:',y_pred)
loss = (0.5*(y-y_pred)**2).mean()
loss.backward()#反向传播
b.data.sub_(l_r*b.grad)
w.data.sub_(l_r*w.grad)
w.grad.zero_()
b.grad.zero_()#_表示在原始的地址下对数据进行处理
print(epoch)
print('loss: ', loss.data.numpy())
if epoch % 20 == 0:
plt.scatter(x.data.numpy(),y.data.numpy())
plt.plot(x.data.numpy(),y_pred.data.numpy(),'r-',lw=5)#lw代表线宽
plt.title("Iteration {}\n w:{} b:{}".format(epoch,w.data.numpy()
,b.data.numpy()))
plt.pause(1)
plt.clf()
if loss.data.numpy() < 0.5:
break
好吧,做这个基本的线性回归我一直没弄出来,然后观察x和y_pred的值发现就是拟合不了,而且网上很多都是用的现成的框架,参考了一下其他人的代码,发现是因为学习率一直不对。最后终于成功了,哎,心累
总结:当无法进行拟合时,可以考虑修改一些参数,比如说学习率