当我们有 pack_sequence() 时,为什么我们需要 pack_padded_sequence()?
Why do we need pack_padded_sequence() when we have pack_sequence()?
阅读 问题的答案后,我仍然对整个 PackedSequence 对象感到困惑。据我了解,这是一个针对循环模型中可变大小序列的并行处理而优化的对象,零填充是一个 [不完美] 解决方案的问题。似乎给定一个 PackedSequence 对象,Pytorch RNN 将处理批处理中的每个序列直到结束,而不是继续处理填充。那么为什么这里需要填充呢?为什么同时存在 pack_padded_sequence() 和 pack_sequence() 方法?
主要是历史原因; torch.nn.pack_padded_sequence()
是在 torch.nn.pack_sequence()
之前创建的(如果我没看错的话,后者第一次出现在 0.4.0
中),我想没有理由删除此功能并破坏向后兼容性。
此外,pad
您的输入的 best/fastest 方式并不总是很清楚,而且它因您使用的数据而异。当数据以某种方式预先填充时(例如,您的数据已预先填充并像那样提供给您),使用 pack_padded_sequence()
会更快(参见 source code of pack_sequence
,它正在计算每个数据点的 length
为您调用 pad_sequence
,然后在内部调用 pack_padded_sequence
)。可以说 pad_packed_sequence
现在很少使用。
最后,请注意自 1.2.0
版本以来为这两个函数提供的 enforce_sorted
参数。不久前,用户必须按照最长序列在前和最短序列对数据(或批次)进行排序,现在当此参数设置为 False
.
时可以在内部完成
阅读
主要是历史原因; torch.nn.pack_padded_sequence()
是在 torch.nn.pack_sequence()
之前创建的(如果我没看错的话,后者第一次出现在 0.4.0
中),我想没有理由删除此功能并破坏向后兼容性。
此外,pad
您的输入的 best/fastest 方式并不总是很清楚,而且它因您使用的数据而异。当数据以某种方式预先填充时(例如,您的数据已预先填充并像那样提供给您),使用 pack_padded_sequence()
会更快(参见 source code of pack_sequence
,它正在计算每个数据点的 length
为您调用 pad_sequence
,然后在内部调用 pack_padded_sequence
)。可以说 pad_packed_sequence
现在很少使用。
最后,请注意自 1.2.0
版本以来为这两个函数提供的 enforce_sorted
参数。不久前,用户必须按照最长序列在前和最短序列对数据(或批次)进行排序,现在当此参数设置为 False
.