标准解释:在原始RNN中,隐藏状态和输出的计算方式为
换句话说,我们从隐藏状态获取输出。
根据Wiki,RNN体系结构可以这样展开:
我一直在使用的代码如下:
job['responsilities']
RNN作为“纯”前馈层:,但是今天,我从Pytorch Tutorial
看到了另一种实现他们的代码就像
class Model(nn.Module):
def __init__(self, input_size, output_size, hidden_dim, n_layers):
super(Model, self).__init__()
self.hidden_dim = hidden_dim
self.rnn = nn.RNN(input_size, hidden_dim, 1)
self.fc = nn.Linear(hidden_dim, output_size)
def forward(self, x):
batch_size = x.size(0)
out, hidden = self.rnn(x)
# getting output from the hidden state
out = out..view(-1, self.hidden_dim)
out = self.fc(out)
return out, hidden
隐藏层的计算与标准解释相同,但是输出是独立于当前隐藏状态class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
self.i2o = nn.Linear(input_size + hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
combined = torch.cat((input, hidden), 1)
hidden = self.i2h(combined)
output = self.i2o(combined)
output = self.softmax(output)
return output, hidden
def initHidden(self):
return torch.zeros(1, self.hidden_size)
计算的。
对我来说,此实现背后的数学公式是:
因此,此实现与原始RNN实现不同吗?
我已经使用RNN近一年了,我认为我能理解,直到今天当我看到Pytorch的这篇文章时。我现在真的很困惑。