Pytorch 中的 LSTM
LSTM in Pytorch
我是 PyTorch 的新手。我遇到了一些包含各种不同示例的 GitHub repository (link to full code example)。
还有一个关于 LSTM 的例子,这是网络 class:
# 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()
。但这意味着,隐藏状态和单元状态将被重置,即在每个训练示例中用零矩阵替换。
名称h0
和c0
表明这只是t=0时的hidden/cell状态,但为什么每次训练都将这些零矩阵移交给lstm例如?
即使它们在第一次调用后被忽略,也不是一个很好的解决方案。
在测试代码时,它指出 MNIST 集上的准确率为 97%,所以它似乎是这样工作的,但对我来说没有意义。
希望有人能帮我解决这个问题。
提前致谢!
显然我走错了路。我混淆了隐藏单元和 hidden/cell 状态。
在训练步骤中只训练 LSTM 中的隐藏单元。细胞状态和隐藏状态在每个序列的开始被重置。所以以这种方式编程是有道理的。
对此感到抱歉..
我是 PyTorch 的新手。我遇到了一些包含各种不同示例的 GitHub repository (link to full code example)。
还有一个关于 LSTM 的例子,这是网络 class:
# 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()
。但这意味着,隐藏状态和单元状态将被重置,即在每个训练示例中用零矩阵替换。
名称h0
和c0
表明这只是t=0时的hidden/cell状态,但为什么每次训练都将这些零矩阵移交给lstm例如?
即使它们在第一次调用后被忽略,也不是一个很好的解决方案。
在测试代码时,它指出 MNIST 集上的准确率为 97%,所以它似乎是这样工作的,但对我来说没有意义。
希望有人能帮我解决这个问题。
提前致谢!
显然我走错了路。我混淆了隐藏单元和 hidden/cell 状态。 在训练步骤中只训练 LSTM 中的隐藏单元。细胞状态和隐藏状态在每个序列的开始被重置。所以以这种方式编程是有道理的。
对此感到抱歉..