解答:pytorch 通过索引赋值后 梯度还能正常反向传播吗

先上测试代码

if __name__=='__main__':
    # scene_graph_token()
    tensor1 = torch.rand(4,4)
    #tensor1.requires_grad_(True)
    tensor2 = torch.rand(4)
    tensor2.requires_grad_(True)
    opt=torch.optim.Adam([tensor2],lr=0.1)

    for i in range(50):
        tensor1[2,:]=tensor2
        tensor3=tensor1*2
        tensor3=tensor3.view(-1)

        sum=torch.sum(tensor3,dim=0)
        print(sum.data)
        print(tensor2.data)
        opt.zero_grad()
        sum.backward(retain_graph=True)
        opt.step()
    pass

解释 :

tensor2是有一行4个数

然后赋值给tensor1的第三行

tensor1简单做了个乘2的运算

然后把tensor1所有数加起来,我们的目标是让这个 和 变小

上结果!

这里输出不太好看,大家凑活看,反正这个和是变小了。

同时输出tensor2,它的值也是在变化

结论:

梯度能正常反向传播

所以大家不必担心梯度问题,pytorch已经为大家封装好了

原因分析:

 Pytorch的计算图就是动态的,如下图所示(图片来自github上的Pytorch),几乎每进行一次运算都会拓展原先的计算图。最后生成完成,进行反向传播,当反向传播完成,计算图默认会被清除,即进行前向传播时记录的计算过程会被释放掉。所以,默认情况下,进行一次前向传播后最多只能用生成的计算图进行一次反向传播。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会写代码的孙悟空

赠人玫瑰 手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值