pytorch seq2seq编码器转发方法

时间:2018-06-13 22:56:50

标签: deep-learning pytorch seq2seq

我跟随Pytorch seq2seq tutorial及以下是他们定义编码器功能的方式。

class EncoderRNN(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(EncoderRNN, self).__init__()
        self.hidden_size = hidden_size

        self.embedding = nn.Embedding(input_size, hidden_size)
        self.gru = nn.GRU(hidden_size, hidden_size)

    def forward(self, input, hidden):
        embedded = self.embedding(input).view(1, 1, -1)
        output = embedded
        output, hidden = self.gru(output, hidden)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, 1, self.hidden_size, device=device)

然而,似乎forward方法在训练期间从未真正被调用过。

以下是教程中使用编码器转发方法的方法:

    for ei in range(input_length):
        encoder_output, encoder_hidden = encoder(input_tensor[ei], encoder_hidden)
        encoder_outputs[ei] = encoder_output[0, 0]

它不应该是encoder.forward而不仅仅是encoder吗? 是否有一些自动'前进'在Pytorch我不知道的机制?

1 个答案:

答案 0 :(得分:2)

在PyTorch中,您通过扩展torch.nn.Module来编写自己的类,并定义前向方法来表达您在model.__call__(...)方法中用作“文书工作”(例如调用挂钩)的所需计算步骤(这是模型(x)将通过python特殊名称规范调用的。)

如果您感到好奇,除了在此致电model(x)之外,您还可以查看model.forward(x)幕后工作的内容:https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/module.py#L462

此外,您可以看到显式调用.foward(x)方法与在此处使用model(x)之间有什么区别:https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/module.py#L72