在 pytorch 中堆叠 LSTM 输出

Posted

技术标签:

【中文标题】在 pytorch 中堆叠 LSTM 输出【英文标题】:Stacking up of LSTM outputs in pytorch 【发布时间】:2019-07-11 23:28:19 【问题描述】:

我正在阅读一些关于使用 lstm 网络进行情绪分析的教程。 下面的代码表示它堆叠了 lstm 输出。我不知道它是如何工作的。

lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim)

【问题讨论】:

你说的是udacity's tutorial code吗?提到的评论有点误导。我认为这意味着将lstm层(lstm_out)的输出转换为单个向量。 @kHarshit 是的,我说的是 udacity 和代码中的注释是 lstm 输出的叠加。 解决方案评论和网络架构图误导我相信堆叠意味着添加另一个 LSTM 层!看了文档,终于看到传入了n_layers这个参数来定义LSTM堆叠多少层。 【参考方案1】:

它确实堆叠了输出,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 *** 中阅读它。总之,它基本上确保您的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]])

【讨论】:

以上是关于在 pytorch 中堆叠 LSTM 输出的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch搭建GNN-LSTM和LSTM-GNN模型实现多变量输入多变量输出时间序列预测

PyTorch LSTM 中的“隐藏”和“输出”有啥区别?

Pytorch LSTM 词性判断

PyTorch-LSTM时间序列预测中如何预测真正的未来值

pytorch 中LSTM模型获取最后一层的输出结果,单向或双向

PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)