Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pytorch 当我们有pack_sequence()时,为什么需要pack_padded_sequence()?_Pytorch_Recurrent Neural Network - Fatal编程技术网

Pytorch 当我们有pack_sequence()时,为什么需要pack_padded_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

在阅读了问题的答案后,我仍然对整个PackedSequence对象有点困惑。据我所知,这是一个为循环模型中可变大小序列的并行处理而优化的对象,零填充是一个[不完美的]解决方案。似乎给定一个PackedSequence对象,Pytorch RNN将处理批处理中的每个序列直到结束,而不是继续处理填充。那么为什么这里需要填充呢?为什么既有pack\u padded\u sequence()方法又有pack\u sequence()方法?

主要是出于历史原因
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功能。