Pytorch 当我们有pack_sequence()时,为什么需要pack_padded_sequence()?
在阅读了问题的答案后,我仍然对整个PackedSequence对象有点困惑。据我所知,这是一个为循环模型中可变大小序列的并行处理而优化的对象,零填充是一个[不完美的]解决方案。似乎给定一个PackedSequence对象,Pytorch RNN将处理批处理中的每个序列直到结束,而不是继续处理填充。那么为什么这里需要填充呢?为什么既有pack\u padded\u sequence()方法又有pack\u sequence()方法?主要是出于历史原因Pytorch 当我们有pack_sequence()时,为什么需要pack_padded_sequence()?,pytorch,recurrent-neural-network,Pytorch,Recurrent Neural Network,在阅读了问题的答案后,我仍然对整个PackedSequence对象有点困惑。据我所知,这是一个为循环模型中可变大小序列的并行处理而优化的对象,零填充是一个[不完美的]解决方案。似乎给定一个PackedSequence对象,Pytorch RNN将处理批处理中的每个序列直到结束,而不是继续处理填充。那么为什么这里需要填充呢?为什么既有pack\u padded\u sequence()方法又有pack\u sequence()方法?主要是出于历史原因torch.nn.pack_padded_seq
torch.nn.pack_padded_sequence()
是在torch.nn.pack_sequence()
之前创建的(如果我没看错的话,后者第一次出现在0.4.0
中),我想没有理由删除此功能并破坏向后兼容性
此外,并不总是清楚什么是最好/最快的方式来填充输入,并且它在您使用的数据上差异很大。当数据事先以某种方式填充时(例如,您的数据被预先填充并以这种方式提供给您),使用pack\u padded\u sequence()
会更快(请参阅,它正在为您计算每个数据点的length
,并在内部调用pad\u sequence
然后调用pack\u padded\u sequence
)。可以说,pad\u-packed\u-sequence
现在很少使用
最后,请注意为这两个函数提供了
1.2.0
版本的exforce_-sorted
参数。不久前,用户必须首先以最长的顺序对数据(或批处理)进行排序,最后以最短的顺序进行排序,现在可以在内部将此参数设置为False
谢谢。为什么pad\u-packed\u-sequence
过时了?如何解包自己的PackedSequence
对象?我写了下面的lambda,它适合我。有更好的办法吗unpack=lambda packed_seq_obj:[tnsr[:ln]对于tnsr,ln在zip中(*pad_packed_seq_obj,batch_first=True))
它不是过时的,我提到它是一个打字错误,对不起。这是一种方法,它取决于您愿意用它做什么(有时不需要解包
,例如,当您需要最后一个时间戳时)。你的解包代码是一条路要走,没有内置的AFAIK功能。