gpt4 book ai didi

tensorflow - 隐藏状态张量与返回张量的顺序不同

转载 作者:行者123 更新时间:2023-12-02 00:49:39 30 4
gpt4 key购买 nike


作为 GRU 训练的一部分,我想检索隐藏状态张量。

我定义了一个有两层的 GRU:

self.lstm = nn.GRU(params.vid_embedding_dim, params.hidden_dim , 2)

forward函数定义如下(以下只是部分实现):

    def forward(self, s, order, batch_size, where, anchor_is_phrase = False):
"""
Forward prop.
"""
# s is of shape [128 , 1 , 300] , 128 is batch size
output, (a,b) = self.lstm(s.cuda())
output.data.contiguous()

out 的形状为:[128 , 400](128 是每个样本嵌入到 400 维向量中的样本数)。

我知道 out 是最后一个隐藏状态的输出,因此我希望它等于 b。然而,在我检查了值之后,我发现它确实相等但是 b 包含不同顺序的张量,例如 output[0]b [49]。我在这里遗漏了什么吗?

谢谢。

最佳答案

我理解你的困惑。看看下面的例子和评论:

# [Batch size, Sequence length, Embedding size]
inputs = torch.rand(128, 5, 300)
gru = nn.GRU(input_size=300, hidden_size=400, num_layers=2, batch_first=True)

with torch.no_grad():
# output is all hidden states, for each element in the batch of the last layer in the RNN
# a is the last hidden state of the first layer
# b is the last hidden state of the second (last) layer
output, (a, b) = gru(inputs)

如果我们打印出形状,它们将证实我们的理解:

print(output.shape) # torch.Size([128, 5, 400])
print(a.shape) # torch.Size([128, 400])
print(b.shape) # torch.Size([128, 400])

此外,我们还可以测试从 output 获得的最后一层的批处理中每个元素的最后隐藏状态是否等于 b:

np.testing.assert_almost_equal(b.numpy(), output[:,:-1,:].numpy())

最后,我们可以创建一个具有 3 层的 RNN,并运行相同的测试:

gru = nn.GRU(input_size=300, hidden_size=400, num_layers=3, batch_first=True)
with torch.no_grad():
output, (a, b, c) = gru(inputs)

np.testing.assert_almost_equal(c.numpy(), output[:,-1,:].numpy())

同样,断言通过,但前提是我们为 c 执行断言,它现在是 RNN 的最后一层。否则:

np.testing.assert_almost_equal(b.numpy(), output[:,-1,:].numpy())

引发错误:

AssertionError: Arrays are not almost equal to 7 decimals

我希望这能让您清楚。

关于tensorflow - 隐藏状态张量与返回张量的顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791808/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com