有关线性回归的知识点之前讲过,想要再巩固和学习一下的小伙伴可以看这一篇:
#导入库
import torch
import numpy as np
from torch.autograd import Variable
#设置CPU生成随机数的种子,方便下次复现实验的结果
torch.manual_seed(2017)
初始化数据
#输入数据
x_train=np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],
[9.779],[6.182],[7.59],[2.167],[7.042],
[10.791],[5.313],[7.997],[3.1]],dtype=np.float32)
y_train=np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],
[3.366],[2.596],[2.53],[1.221],[2.827],
[3.465],[1.65],[2.904],[1.3]],dtype=np.float32)
#画出图像
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(x_train,y_train,'bo')#b为蓝色,o为圆点
#转换成tensor
x_train=torch.from_numpy(x_train)
y_train=torch.from_numpy(y_train)
#定义参数w和b
w=Variable(torch.randn(1),requires_grad=True) #随机初始化
b=Variable(torch.zeros(1),requires_grad=True)#使用0 进行初始化
#构建线性回归模型
x_train=Variable(x_train)
y_train=Variable(y_train)
def linear_model(x):
return x*w+b
y_=linear_model(x_train)
经过上面的步骤我们就定义好了模型,在进行参数更新之前,我们可以先看看 模型的输出结果长什么样
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label="real")
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')#r 红色,o:标记字符
plt.legend()#显示图例的位置,自适应方式
#计算误差
def get_loss(y_,y):
return torch.mean(y_-y_train)**2
loss=get_loss(y_,y_train)
#打印一下看看loss的大小
print(loss)
tensor(130.7933, grad_fn=<PowBackward0>)
定义好了误差函数,接下来我们需要计算w和b的梯度了,这时得益于pytorch的自动求导,我们不需要动手去算梯度
#自动求导
loss.backward()
#查看w和b的梯度
print(w.grad)
print(b.grad)
tensor([138.7155])
tensor([22.8730])
#更新一次参数
w.data=w.data-1e-2 * w.grad.data
b.data=b.data-1e-2 * b.grad.data
更新完成参数后,我们再一次看看模型输出的结果
y_=linear_model(x_train)
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label='real')
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')
plt.legend()
从上面的例子可以看到,更新之后红色的线跑到了蓝色的线下面,没有特别好的拟合蓝色的真实值,所以我们需要在进行几次更新
for e in range(10): #进行10次更新
y_=linear_model(x_train)
loss=get_loss(y_,y_train)
w.grad.zero_() #记得归零梯度
b.grad.zero_() #记得归零梯度
loss.backward()
w.data=w.data-1e-2 *w.grad.data #更新 w
b.data=b.data-1e-2 *b.grad.data #更新 b
print('epoch:{}, loss:{}'.format(e,loss.data))
输出:
epoch:0, loss:0.46674472093582153 epoch:1, loss:0.02788214012980461 epoch:2, loss:0.0016656038351356983 epoch:3, loss:9.950181993190199e-05 epoch:4, loss:5.944333224761067e-06 epoch:5, loss:3.5499670048011467e-07 epoch:6, loss:2.1209265455013337e-08 epoch:7, loss:1.2619807421287987e-09 epoch:8, loss:7.326036999266705e-11 epoch:9, loss:4.5025667222420296e-12
y_=linear_model(x_train)
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label='real')
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')
plt.legend()
更新10次之后,我们发现红色的预测结果已经比较好的拟合了蓝色的真实值