嗨,我有一个关于如何从BI-LSTM模块的输出中收集正确结果的问题。
假设我有一个长度为10的序列,输入到一个有100个隐藏单元的单层LSTM模块中:
lstm = nn.LSTM(5, 100, 1, bidirectional=True)
字符串output
的形状为:
[10 (seq_length), 1 (batch), 200 (num_directions * hidden_size)]
# or according to the doc, can be viewed as
[10 (seq_length), 1 (batch), 2 (num_directions), 100 (hidden_size)]
型
如果我想在两个方向(两个100维向量)上获得第三个(1索引)输入的输出,我如何正确地做到这一点?
我知道output[2, 0]
会给予我一个200-dim矢量。这个200暗矢量是否表示两个方向上的第三输入的输出?
一件困扰我的事情是,当做反向馈送时,第三个(1-index)输出向量是从第八个(1-index)输入计算出来的,对吗?
pytorch会自动处理这个问题,并根据方向对输出进行分组吗?
谢谢你,谢谢
3条答案
按热度按时间ctzwtxfj1#
是的,当使用BiLSTM时,方向的隐藏状态只是连接在一起(中间之后的第二部分是以相反顺序馈送的隐藏状态)。
所以在中间分开就可以了。
由于重塑是从右向左的,所以在分离两个方向时不会有任何问题。
下面是一个小例子:
字符串
输出:
型
fzwojiic2#
我知道output[2,0]会给予我一个200-dim的向量。这个200个暗矢量是否表示两个方向上的第三个输入的输出?
答案是是。
LSTM模块输出的
output
Tensor是输入序列中相应位置处的前向LSTM输出和后向LSTM输出的级联。h_n
Tensor是最后一个时间戳的输出,它是前向LSTM中lsat令牌的输出,但在后向LSTM中是第一个令牌。字符串
blmhpbnm3#
我知道output[2,0]会给予我一个200-dim的向量。这个200个暗矢量是否表示两个方向上的第三个输入的输出?
是的,也不是。它确实表示两个方向上索引2处的输入的输出,但不是每个方向上的第3个输入。RNN看到的正向方向上的第三个输入在索引2处,并且反向方向上的第三个输入在索引7处。
此外,就每个方向上的最后可能输出而言,以下解释是重要的。在正向方向上,最后一个输出将在索引9(第10个输出),而在反向方向上的最后一个输出将在索引0(第10个输出)。
如果您将
output
视为:字符串
然后,正向方向上的最后一个输出将是
output[9][0][0]
,反向方向上的最后一个输出将是output[0][0][1]
。我希望这能澄清一些事情。