如何将填充序列张量转换为预期的 RNN 格式?

How to convert padded sequence tensor to expected RNN format?

我有一个形状为 (batch_size, max_sequence_length, embedding_size) 的张量,它被填充到最大长度以存储序列。我也有(batch_size, max_sequence_length, vocab),例如:

# Batch size many, (batch_size, 4, 8)
[2,4,1,4]
[7,4,2,0]
[6,0,0,0]
# Using EmbedID(ignore_label=0) to get (batch_size, 4, embeddeding_size)

我们如何将其传递给 Chainer 中的 NStepGRU link?例如获取所有序列的最终隐藏状态 (batch_size, embedding_size)?

NStepGRU 接受一批序列作为其元素形状为 (sequence_length, embedding_size) 的列表。请注意,这里不需要填充;每个元素可以有不同的长度。

如果你有一个张量 x 的形状 (batch_size, max_sequence_length, embedding_size) 和序列的长度 lengths,你可以将 [x[i, :l] for i, l in enumerate(lengths)] 传递给 NStepGRU

NStepGRU returns ys 最后一层的输出和 hs 最终隐藏状态。由于NStepGRU可能包含多个层,因此为每一层提供了最终的隐藏状态;即,ys 的形状为 (num_layers, batch_size, embedding_size)。如果你使用单层 NStepGRU,只需提取 hs[0] returns 形状 (batch_size, embedding_size).

的最终隐藏状态