我正在阅读一些有关使用lstm网络进行情感分析的教程。 下面的代码说,它堆叠了lstm输出。我不知道它是如何工作的。
lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim)
答案 0 :(得分:0)
它的确堆积了输出,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} }将产生张量(-1, hidden_dim)
,其中第一行包含正向输出,“堆叠”在第二行的顶部,等于反向层的输出。
视觉示例:
(2, hidden_dim)