python中'ctx'和'self'之间的区别?

时间:2018-03-27 14:53:41

标签: python pytorch

在使用深度学习库PyTorch时,我遇到了这样的定义。 ctxself具有相同的行为吗?

class LinearFunction(Function):

    @staticmethod
    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.saved_variables
        grad_input = grad_weight = grad_bias = None
        if ctx.needs_input_grad[0]:
            grad_input = grad_output.mm(weight)
        if ctx.needs_input_grad[1]:
            grad_weight = grad_output.t().mm(input)
        if bias is not None and ctx.needs_input_grad[2]:
            grad_bias = grad_output.sum(0).squeeze(0)

        return grad_input, grad_weight, grad_bias

2 个答案:

答案 0 :(得分:5)

直接使用类类型调用静态方法(@staticmethod),而不是此类的实例 < / p>

LinearFunction.backward(x, y)

由于您没有实例,因此在静态方法中使用self没有意义。

此处, ctx只是一个常规参数,在调用方法时必须传递。

答案 1 :(得分:0)

@staticmethod是函数decorator

从文档中

  

静态方法不接收隐式的第一个参数。调用以@staticmethod装饰的函数时,我们不会将类的实例传递给它(通常与方法一样)。这意味着我们可以在一个类中放置一个函数,但不能访问该类的实例(这在您的方法不使用该实例时非常有用)。

当您需要一个不访问类的任何属性但知道它属于该类的实用工具函数时,请使用静态函数。

您的示例ctxparameter,从技术上讲,它是self的属性,可以在其中放置许多张量。

注意:当您定义torch.nn.Module时,仅定义forward()函数,而不是@staticmethod。当您定义新的autograd函数时,您同时定义了forward()的{​​{1}}和backward()函数。