我正在阅读this教程。我对以下课程代码有疑问:
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_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()
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 init_hidden(self):
return Variable(torch.zeros(1, self.hidden_size))
此代码取自Here。有人提到
由于网络状态保存在图形中而不是图层中,因此您可以简单地创建一个nn.Linear并将其重复使用以重复。
我不明白的是,如何才能以nn.Linear为单位增加输入要素的大小并说它是RNN。我在这里想念什么?
答案 0 :(得分:2)
网络是经常性的,因为您在示例中评估了多个时间步长。 以下代码也摘自pytorch tutorial you linked to。
loss_fn = nn.MSELoss()
batch_size = 10
TIMESTEPS = 5
# Create some fake data
batch = torch.randn(batch_size, 50)
hidden = torch.zeros(batch_size, 20)
target = torch.zeros(batch_size, 10)
loss = 0
for t in range(TIMESTEPS):
# yes! you can reuse the same network several times,
# sum up the losses, and call backward!
hidden, output = rnn(batch, hidden)
loss += loss_fn(output, target)
loss.backward()
因此网络本身不是递归的,但是在此循环中,您可以多次输入前一个前进步骤的隐藏状态以及批量输入,将其用作递归网络。
您还可以通过在每个步骤中反向传播损失并忽略隐藏状态来非周期性地使用它。
由于网络状态保存在图形中而不是图层中,因此您可以简单地创建一个nn.Linear并将其重复使用以重复。
这意味着,计算梯度的信息未保存在模型本身中,因此您可以将模块的多个评估附加到图形中,然后在整个图形中反向传播。 本教程前面的段落对此进行了描述。