什么时候需要一个pytorch自定义函数(而不仅仅是一个模块)?

for*_*cks 13 torch pytorch

Pytorch初学者在这里!考虑以下自定义模块:

class Testme(nn.Module):
    def __init__(self):
        super(Testme, self).__init__()

def forward(self, x):
    return x / t_.max(x).expand_as(x)
Run Code Online (Sandbox Code Playgroud)

据我所知,文档:我相信这也可以作为一个自定义实现Function.子类Function需要一个backward()方法,但 Module不需要.同样,在线性的doc示例中Module,它取决于线性Function:

class Linear(nn.Module):
    def __init__(self, input_features, output_features, bias=True):
        ...    
    def forward(self, input):
        return Linear()(input, self.weight, self.bias)
Run Code Online (Sandbox Code Playgroud)

问题:我不明白之间的关系ModuleFunction.在上面的第一个清单(模块Testme)中,它是否应该有相关的功能?如果没有,那么就可以实现这个没有一个backward通过继承模块的方法,那么为什么一个Function总是需要一个backward方法是什么?

也许Functions仅适用于不是由现有火炬功能组成的功能?换句话说:Function如果他们的forward方法完全由先前定义的火炬函数组成,那么模块可能不需要关联?

mex*_*mex 14

这些信息是从官方PyTorch Documentaion收集和总结的.

torch.autograd.Function真正位于PyTorch的autograd软件包的核心.您在PyTorch中构建的任何图形以及您在PyTorch中执行的任何操作Variables都基于a Function.任何函数都需要 __init__(), forward()backward()方法(更多信息请参见http://pytorch.org/docs/notes/extending.html).这使PyTorch能够计算结果并计算梯度Variables.

nn.Module()相比之下,实际上只是组织模型,不同图层等的便利.例如,它可以组织模型中的所有可训练参数,.parameters()并允许您轻松地将另一个图层添加到模型中等等.它不是您定义向后方法的位置,因为在该forward()方法中,您应该使用Function()已经定义的子类backward().因此,如果您已经指定了操作的顺序forward(),PyTorch已经知道如何反向传播渐变.

现在,你何时应该使用什么?

如果你的操作只是PyTorch中现有实现函数的组合(就像你上面的那样),那么自己添加任何子类到Function()都没有意义.因为您可以堆叠操作并构建动态图形.然而,将这些操作结合在一起是一个明智的想法.如果任何操作涉及可训练参数(例如神经网络的线性层),则应该nn.Module()在forward方法中将您的操作子类化并组合在一起.这允许您轻松访问参数(如上所述)以供使用torch.optim等.如果您没有任何可训练的参数,我可能仍然将它们组合在一起,但是标准的Python函数,您可以在其中处理你使用的每个操作就足够了.

如果您有一个新的自定义操作(例如,带有一些复杂采样过程的新随机层),您应该子类化Function()并定义__init__(), forward()backward()告诉PyTorch如何计算结果以及如何使用此操作计算渐变.之后,如果您的操作具有可训练的参数,您应该创建一个功能版本来处理即时功能并使用您的操作或创建一个模块.同样,您可以在上面的链接中阅读更多相关信息.