pytorch反向传播原理

假设我们有一组数据如下表所示,,表示学习时长和分数的关系,我们要推断出当x=4时,y为多少

x(hours)y(points)
12
24
36
4?

通常情况下我们假设上述模型是一个线性模即y=w*x+b,这里为了简单省略为y=w*x。

下面模型模拟pytorch的计算过程:

下图是我个人关于整个求导的流程的理解,x=1,y^=2,w的初始值为1。

然后根据w=w-learningrate*\frac{\partial loss}{\partial w}(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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值