在 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模型实现多变量输入多变量输出时间序列预测