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