Pytorch入门学习(八)-----自定义层的实现(甚至不可导operation的backward写法)

本文介绍了在PyTorch中如何自定义不可导操作的反向传播过程。在forward函数中,所有Variable都会转换为Tensor。在backward中,grad_output是一个Variable,如果需要二阶梯度,其requires_grad应为True。关键在于,虽然forward中可以使用Tensor进行任意操作,但backward中必须使用Variable以确保自动求导的正确性。由于自动求导的图在backward中构建,所以在backward中直接使用data会导致无法创建正确图。对于不可导操作,可以通过近似算法在backward中返回Tensor。
摘要由CSDN通过智能技术生成

总说

虽然pytorch可以自动求导,但是有时候一些操作是不可导的,这时候你需要自定义求导方式。也就是所谓的 “Extending torch.autograd”. 官网虽然给了例子,但是很简单。这里将会更好的说明。
#扩展 torch.autograd

class LinearFunction(Function):

    # 必须是staticmethod
    @staticmethod
    # 第一个是ctx,第二个是input,其他是可选参数。
    # ctx在这里类似self,ctx的属性可以在backward中调用。
    def forward(ctx, input, weight, bias=None):
        ctx.save_for_backward(input, weight, bias)
        output = input.mm(weight.t())
        if bias is not None:
            output += bias.unsqueeze(0).expand_as(output)
        return output


    @staticmethod
    def backward(ctx, grad_output): 
        input, weight, bias = ctx.</
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值