Python pytorch中LSTM输出的叠加

Python pytorch中LSTM输出的叠加,python,deep-learning,lstm,pytorch,Python,Deep Learning,Lstm,Pytorch,我正在阅读一些关于使用lstm网络进行情绪分析的教程。 下面的代码表示它会叠加lstm输出。我不知道它是怎么工作的 lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim) 它确实堆叠了输出,kHarshit的评论在这里是误导性的 为了直观地看到这一点,让我们回顾一下本教程中前一行的输出(访问日期:2019年5月1日): 此项的输出维度将为[序列长度、批次大小、隐藏大小*2],如所示。这里,输入的长度是双向LSTM的两倍。因此,最后一

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

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

它确实堆叠了输出,kHarshit的评论在这里是误导性的

为了直观地看到这一点,让我们回顾一下本教程中前一行的输出(访问日期:2019年5月1日):

此项的输出维度将为
[序列长度、批次大小、隐藏大小*2]
,如所示。这里,输入的长度是双向LSTM的两倍。因此,最后一个维度的前半部分将始终是向前输出,然后是向后输出(我不完全确定其方向,但在我看来它已经在正确的方向上)

然后,您关心的实际线路:

我们在这里忽略了
.continuous()
的细节,但您可以在中详细阅读。总之,它基本上确保您的
torch.Tensor
在内存中正确对齐
最后,
.view()
允许您以特定的方式重塑生成的张量。这里,我们的目标是一个具有两个维度的形状(由
.view()的输入参数数量定义)
。具体地说,第二维度被认为具有第一维度的大小
隐藏\u dim
-1
,这意味着我们正在以这样一种方式重新分配向量维度,即我们不关心确切的维度,而只是满足另一维度的要求。
因此,如果你有一个长度为40的向量,并且想要将其重塑为
(-1,10)
,那么得到的张量将具有形状
(4,10)

正如我们之前所说的,向量的前半部分(长度
hidden\u dim
)是正向输出,后半部分是后半部分,那么分解成
(-1,hidden\u dim)
张量将产生
(2,hidden\u 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]])

你在说什么?上面提到的评论有点误导。我认为它的意思是转换lstm层的输出(
lstm\u out
)是的,代码中的注释是lstm输出的堆栈。解决方案注释和网络架构图误导了我,使我相信堆栈意味着添加另一个lstm层!阅读文档后,我终于看到传入n_layers参数来定义有多少层LSTM的R被堆叠起来。
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]])