Pytorch学习笔记-Autograd自动求导与梯度操作

本文解析了PyTorch中tensor.grad和tensor.grad.data的区别,强调了在自定义autograd函数中ctx.save_for_backward的作用,并介绍了如何正确管理梯度计算以避免内存问题。还提到了在with torch.no_grad()的上下文中使用grad进行操作的技巧。
  • tensor.gradtensor.grad.data区别是什么?

    手动进行梯度更新时,如果直接用tensor.grad进行运算则会被加入计算图,导致内存占用不停加大以及累计梯度出错,用tensor.grad.data则不会。或者可以在with torch.no_grad():下直接用tensor.grad进行,这样就不会被加入计算图或者梯度累加

    __注意:__不管哪种方法,每次更新完都记得对梯度清空!!!

  • Pytorch教程中有一段关于自定义autograd函数的代码

    class LegendrePolynomial3(torch.autograd.Function):
        """
        implement custom autograd Functions by subclassing
        torch.autograd.Function and implementing the forward and backward passes
        which operate on Tensors.
        """
        @staticmethod
        def forward(ctx, input):
            ctx.save_for_backward(input)
            return 0.5 * (5 * input ** 3 - 3 * input)
    
        @staticmethod
        def backward(ctx, grad_output):
            input, = ctx.saved_tensors
            return grad_output * 1.5 * (5 * input ** 2 - 1)
    

    调用方法为

    P3 = LegendrePolynomial3.apply
    y_pred = a + b * P3(c + d * x)
    

    在定义LegendrePolynomial3forward()函数中有一句ctx.save_for_backward(input)input存储,而在对应的backward()中则用input, = ctx.saved_tensorsinput取出,ctx的相关save操作可以理解为类似CS231n作业中forward()backward()函数中的cache变量的作用,用于当前计算步骤的梯度计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值