pytorch RNN的输出是什么



下面有一个简单的rnn代码。

rnn = nn.RNN(1, 1, 1, bias = False, batch_first = True)
t = torch.ones(size = (1, 2, 1))
output, hidden = rnn(t)
print(rnn.weight_ih_l0)
print(rnn.weight_hh_l0)
print(output)
print(hidden)
# Outputs
Parameter containing:
tensor([[0.7199]], requires_grad=True)
Parameter containing:
tensor([[0.4698]], requires_grad=True)
tensor([[[0.6168],
[0.7656]]], grad_fn=<TransposeBackward1>)
tensor([[[0.7656]]], grad_fn=<StackBackward>)
tensor([[[0.7656]]], grad_fn=<StackBackward>)

我从PyTorch文档中了解到,上面的输出是隐藏状态。

因此,我尝试使用以下手动计算输出

hidden_state1 = torch.tanh(t[0][0] * rnn.weight_ih_l0)
print(hidden_state1)
hidden_state2 = torch.tanh(t[0][1] * rnn.weight_ih_l0 + hidden_state1 * rnn.weight_hh_l0)
print(hidden_state2)
tensor([[0.6168]], grad_fn=<TanhBackward>)
tensor([[0.7656]], grad_fn=<TanhBackward>)

结果是正确的。状态1和状态2与输出匹配。

hidden_states不应该乘以输出权重来获得输出吗?

我检查了从隐藏状态连接到输出的权重。但是根本没有重量。

如果rnn的目标是只计算隐藏状态,有人能告诉我如何获得输出吗?

是否应该将hidden_states与输出权重相乘以获得输出

是和否。这取决于您的问题公式。假设您正在处理一个案例,其中最后一个时间步长的输出只起作用。在这种情况下,将隐藏状态乘以每个单位的输出权重是没有意义的。这就是为什么pytorch只将隐藏输出作为抽象值提供给你,之后你就可以根据你的问题对隐藏状态为所欲为了。

在您的特定情况下,假设您希望在每个时间步长将另一个线性层应用于输出。您可以简单地通过定义一个线性层并传播隐藏单元的输出来实现这一点。

#Linear Layer
##hidden_feature_size = 1 in your case
lin_layer = nn.Linear(hidden_feature_size, output_feature_size) 
#output from first timestep
linear_layer(output[0])
#output from second timestep
linear_layer(output[1])

最新更新