我是PyTorch的新手。我遇到了这个GitHub repository (link to full code example),其中包含各种不同的示例。

还有一个有关LSTM的示例,这是Network类:

# RNN Model (Many-to-One)
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        # Set initial states
        h0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size))
        c0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size))

        # Forward propagate RNN
        out, _ = self.lstm(x, (h0, c0))

        # Decode hidden state of last time step
        out = self.fc(out[:, -1, :])
        return out

所以我的问题是关于以下几行:

h0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size))
c0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size))

据我了解,每个训练示例都需要调用forward()。但这意味着,将重置隐藏状态和单元状态,即在每个训练示例上都将其替换为零矩阵。

名称h0c0表示这只是t = 0时的隐藏/单元状态,但是为什么在每个训练示例中将这些零矩阵移交给lstm?

即使在第一次调用后只是忽略它们,这也不是一个很好的解决方案。

在测试代​​码时,它在MNIST集合上指出了97%的准确性,因此它似乎可以这种方式工作,但是对我来说这没有意义。

希望有人可以帮我这个忙。

提前致谢!

最佳答案

显然我在这方面走错了路。我混淆了隐藏单元和隐藏/单元状态。
在训练步骤中,仅训练LSTM中的隐藏单元。单元状态和隐藏状态在每个序列的开头重置。因此,以这种方式进行编程就很有意义。

非常遗憾..

关于python - Pytorch中的LSTM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48831585/

10-12 23:46