假设我们有一组数据如下表所示,,表示学习时长和分数的关系,我们要推断出当x=4时,y为多少
x(hours) | y(points) |
1 | 2 |
2 | 4 |
3 | 6 |
4 | ? |
通常情况下我们假设上述模型是一个线性模即y=w*x+b,这里为了简单省略为y=w*x。
下面模型模拟pytorch的计算过程:
下图是我个人关于整个求导的流程的理解,x=1,y^=2,w的初始值为1。
然后根据w=w-learningrate*(learningrate=0.01)获得更新后的w=1.02
代码实现
在pytorch使用Autograd模块实现深度学习的反向传播求导,tensor类本身就支持了使用autograd功能,因此需要使用该功能时,可以将.requires_grad=True。通过grad属性保持对应的数据;因此,可以通过xxx.grad查看对应的梯度值。
PyTorch会自动追踪和记录对与张量的所有操作,当计算完成后调用.backward()方法自动计算梯度并且将计算结果保存到grad属性中。
import torch
#假设w的初始值为1.0,并通过设置 requires_grad标识为Ture来
#告诉Pytorch需要对该张量进行自动求导,PyTorch会记录该张量的每一步操作历史并自动计算
w=torch.tensor([1.0],requires_grad=True)
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
#定义损失函数、
def forward(x): # y^ = wx
return x * w # w是tensor 所以 这个乘法自动转换为tensor数乘 , x被转化成tensor 这里构建了一个计算图
def loss(x, y): # 计算单个的误差 : 损失
'''
每调用一次loss函数,计算图自动构建一次
:param x:
:param y:
:return:
'''
y_pred = forward(x)
return (y_pred - y) ** 2
eli=[]
lli=[]
print('predict(before training)',4,forward(4).item())
for epoch in range(100):
for x,y in zip(x_data,y_data):
l=loss(x,y)
l.backward()#自动求梯度
print('\tgrad:', x, y, w.grad.item())
w.data=w.data-0.01*w.grad.data
#清空权重,不然梯度会累加
w.grad.data.zero_()
eli.append(epoch)
lli.append(l.item())
print('progress:',epoch,l.item())
print('predict(after training)',4,forward(4).item())
其可视化结果如下图所示:
import matplotlib.pyplot as plt
plt.plot(eli, lli)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()
参考文献:https://blog.csdn.net/Weary_PJ/article/details/105706318
pytorch-handbook