gpt4 book ai didi

torch - 什么时候需要 pytorch 自定义功能(而不仅仅是一个模块)?

转载 作者:行者123 更新时间:2023-12-03 23:43:39 29 4
gpt4 key购买 nike

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

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

def forward(self, x):
return x / t_.max(x).expand_as(x)

据我了解文档:
我相信这也可以作为自定义 Function 来实现. Function 的子类需要 backward()方法,但是 Module才不是。同样,在线性 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)

问题:我不明白 Module 之间的关系和 Function .在上面的第一个 list (模块 Testme )中,它应该有关联的功能吗?如果没有,那么可以在没有 backward 的情况下实现它。通过子类化 Module 的方法,那么为什么 Function总是需要 backward方法?

也许 Function s 仅适用于不是由现有的火炬功能组成的功能吗?换一种说法:也许模块不需要相关的 Function如果他们的 forward方法完全由先前定义的火炬函数组成?

最佳答案

这些信息是从官方 PyTorch 文档中收集和总结的。
torch.autograd.Function真正位于 PyTorch 中 autograd 包的核心。您在 PyTorch 中构建的任何图表以及您在 Variables 上执行的任何操作在 PyTorch 中基于 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 如何计算结果以及如何计算梯度。之后,如果您的操作具有可训练的参数,您应该创建一个函数版本来处理实例化函数并使用您的操作或创建一个模块。同样,您可以在上面的链接中阅读更多相关信息。

关于torch - 什么时候需要 pytorch 自定义功能(而不仅仅是一个模块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428784/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com