pytorch中的GRU模型输出两个对象:输出要素以及隐藏状态。我知道对于分类,一个使用输出功能,但是我不确定是哪个。具体而言,在解码器部分中使用GRU的典型解码器-编码器体系结构中,通常只会将最后一个(按时间,即t = N,其中N是输入序列的长度)传递给编码器。输出张量的哪一部分引用此时间最后输出?
GRU的创建方式如下(请注意,它是双向的):
self.gru = nn.GRU(
700,
700,
bidirectional=True,
batch_first=True,
)
给定一些表示大小为150x700的文本的嵌入矢量,我像这样使用GRU(序列长度为150,嵌入尺寸为700):
gru_out, gru_hidden = self.gru(embedding)
gru_out的形状为150x1400,其中150还是序列长度,而1400是嵌入尺寸的两倍,这是因为GRU是双向的(根据pytorch的文档,hidden_size * num_directions)。
如果我只想访问按时间顺序显示的最后一个输出,是否需要像这样访问它?
tmp = gru_out.view(150, 2, 700)
last_out_first_direction = tmp[149, 0, :]
last_out_second_direction = tmp[149, 1, :]
虽然从技术上讲这是正确的,并且类似于发布的答案here,但它还要求实际输入序列的长度始终为150,而通常情况下,您还需要将较短的实际输入序列填充为以下内容:长度为150。但是,在GRU中,人们通常对最后一个实际的输入令牌感兴趣,因此它也可以位于位置<150。 访问实际的最后令牌或时间步(<= 150)而不是仅从技术上最后一步(总是= 150)的常见方法是什么?
旁边的问题:第二个方向的输出是否颠倒了(因为信息通过GRU传递的方向也比第一个方向颠倒了),所以我实际上应该访问last_out_second_direction = tmp[0, 1, :]
而不是{{1 }}?