它确实堆叠了输出,kHarshit 的评论在这里具有误导性!
为了形象化这一点,让我们回顾一下本教程(2019 年 5 月 1 日访问)中上一行的输出:
lstm_out, hidden = self.lstm(embeds, hidden)
根据the documentation,它的输出维度将是[sequence_length, batch_size, hidden_size*2]。在这里,两倍输入的长度来自于具有双向 LSTM。因此,最后一个维度的前半部分将始终是前向输出,然后是后向输出(我不完全确定其方向,但在我看来它已经朝着正确的方向发展)。
那么,你关心的实际线路:
我们在这里忽略了.contiguous() 的细节,但您可以在this excellent answer on Stackoverflow 中阅读它。总之,它基本上确保您的torch.Tensor 在内存中正确对齐。
最后,.view() 允许您以特定方式重塑生成的张量。在这里,我们的目标是具有两个维度的形状(由.view() 的输入参数的数量定义。具体来说,第二个维度的大小应该是hidden_dim。-1 的第一个维度只是意味着我们正在重新分配向量维度,使得我们不关心确切的维度,而只是满足其他维度的要求。
因此,如果您有一个长度为 40 的向量,并且想要将其重新整形为 (-1, 10) 的 2D 张量,那么生成的张量将具有 (4, 10) 的形状。
正如我们之前所说的,向量的前半部分(长度hidden_dim)是前向输出,后半部分是后半部分,那么结果分裂成一个张量(-1, hidden_dim)就会得到在(2, hidden_dim) 的张量中,第一行包含正向输出,“堆叠”在第二行顶部,等于反向层的输出。
视觉示例:
lstm_out, hidden = self.lstm(embeds, hidden)
print(lstm_out) # imagine a sample output like [1,0 , 2,0]
# forward out | backward out
stacked = lstm_out.contiguous().view(-1,hidden_dim) # hidden_dim = 2
print(stacked) # torch.Tensor([[1,0],
# [2,0]])