何时需要在PyTorch中明确调用model.forward(input)?

3
在大多数PyTorch示例中,我看到的是out = model(input)而不是out = model.forward(input)。我理解后者不处理任何钩子,并且第一种选项通常更受欢迎
然而,在Annotated Transformer Attention Is All You Need Transformer的实现中,他们使用model.forward()来获取整个模型的输出,但是模型中的所有层都是使用layer(x)而不是layer.forward(x)调用的。我认为这个显式使用.forward()是有意义的,但是无法弄清楚原因。
编辑: 非常抱歉没有明确我所说的层是什么。我所指的代码结构如下:
class model(nn.Module):

    def __init__(self, layer1, layer2, layer3):
        super(model, self).__init__()
        self.layer1 = layer1
        self.layer2 = layer2 
        self.layer3 = layer3

    def forward(self, x):
        return self.layer2(self.layer1(x))

class layer1(nn.Module):

    def __init__(self, inputs):
        super(layer3, self).__init__()
        ## set stuff here

    def forward(self, x):
        ## do stuff to x
        return x

class layer2(nn.Module):

    def __init__(self, layer, N):
        super(layer2, self).__init__()
        ## set stuff here

    def forward(self, x):
        ## do more stuff to x
        return x

正如您所看到的,在model中,通过layer(x)将x传递到所有层,但在这个特定的例子中,输出是通过out = model.forward(input)计算的。
1个回答

0

当你定义你的模型时,它可能看起来像这样:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        
        self.layer_1 = nn.Linear(10, 64)
        self.layer_2 = nn.Linear(64, 64)
        self.layer_out = nn.Linear(64, 1)
        
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(p = 0.1)
        self.batchnorm1 = nn.BatchNorm1d(64)
        self.batchnorm2 = nn.BatchNorm1d(64)
        
    def forward(self, inputs):
        x = self.relu(self.layer_1(inputs))
        x = self.batchnorm1(x)
        x = self.relu(self.layer_2(x))
        x = self.batchnorm2(x)
        x = self.dropout(x)
        x = self.layer_out(x)
        
        return (x)

forward() 是您的模型对象的方法,而不是您的层对象的方法。层对象可以将输入作为参数,但您不能在层上调用 forward(),因为这些对象没有 forward 方法。

希望这有意义。


非常抱歉,我意识到我对“层”这个概念的表述不够清晰,并已经编辑了问题。 - The Hagen
1
在我所提到的例子中,每个层实际上都继承自nn.Module,并且确实有一个forward()方法。 - The Hagen
1
@TheHagen 毫无问题!确实很有趣。据我理解,您可以执行调用方法(如您所说),并且一个方法只是简单地丢弃钩子。由于图层继承自定义模型,我想图层也是一样的。由于这段代码来自学术论文,我认为他们正在使用.forward()作为展示模型何时被训练的方式。这里也有一些信息:https://discuss.pytorch.org/t/any-different-between-model-input-and-model-forward-input/3690 - rob0tst0p
可能就是这样了。我在他们的代码中没有找到任何钩子,所以可能只是一个可读性问题。 - The Hagen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接