pytorch - 当我们有 pack_sequence() 时,为什么我们需要 pack_padded_sequence()?

标签 pytorch recurrent-neural-network

阅读 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_sorted1.2.0 以来提供的参数这两个功能的版本。不久前,用户必须先用最长的序列和最短的序列对他们的数据(或批次)进行排序,现在当这个参数设置为 False 时可以在内部完成。 .

关于pytorch - 当我们有 pack_sequence() 时,为什么我们需要 pack_padded_sequence()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938530/

相关文章:

python - pytorch 可以优化顺序操作(如 tensorflow 图或 JAX 的 jit)吗?

python - 使用以每小时时间序列作为输入的 LSTM 预测每日值(value)

python - Keras + LSTM/RNN : trouble with dimensionality of `X` 's for new predictions

python - 给定一个表示段边界的值,为张量生成段标签

python - PyTorch 的文档 .to ('cpu' ) 或 .to ('cuda' )

python - BasicRNNCell 偏差没有得到训练

python - 使用 tensorflow 进行预测

TensorFlow - 根据 CTC 损失层的空白标签索引

python - 如何在类中使用私有(private)方法反序列化 PyTorch 保存的模型?

python - 在 matplotlib 中显示张量图像