Kou*_*k J 5 python deep-learning lstm pytorch
我正在学习一些关于使用 lstm 网络进行情感分析的教程。下面的代码表示它堆叠了 lstm 输出。我不知道它是如何工作的。
lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim)
Run Code Online (Sandbox Code Playgroud)
它确实堆叠了输出,kHarshit 的评论在这里具有误导性!
为了直观地看到这一点,让我们回顾一下教程中前一行的输出(2019 年 5 月 1 日访问):
lstm_out, hidden = self.lstm(embeds, hidden)
Run Code Online (Sandbox Code Playgroud)
[sequence_length, batch_size, hidden_size*2]根据文档,其输出尺寸为。这里,两倍输入的长度来自于双向 LSTM。因此,最后一个维度的前半部分将始终是前向输出,然后是后向输出(我不完全确定其方向,但在我看来,它已经在正确的方向上)。
然后,您关心的实际行:
我们忽略这里的细节,但您可以在Stackoverflow 上的这个优秀答案.contiguous()中阅读它。总之,它基本上确保您在内存中处于正确的对齐位置。
最后,允许您以特定方式重塑结果张量。在这里,我们的目标是具有二维的形状(由 的输入参数的数量定义。具体来说,第二个维度的大小应该是。对于第一个维度,仅仅意味着我们正在重新分配向量维度这样我们就不必关心确切的维度,而只需满足另一个维度的要求。
因此,如果您有一个长度为 40 的向量,并且想要将其重塑为 的 2D 张量,那么得到的张量将具有形状。torch.Tensor.view().view()hidden_dim-1(-1, 10)(4, 10)
正如我们之前所说,向量的前半部分 (length 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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |