1 PACK_PADDED_SEQUENCE
1.0 功能
- 将填充的序列打包成一个更加紧凑的形式
- 这样RNN、LSTM和GRU等模型可以更高效地处理它们,因为它们可以跳过不必要的计算
1.2 基本使用方法
python
torch.nn.utils.rnn.pack_padded_sequence(
input,
lengths,
batch_first=False,
enforce_sorted=True)
1.3 参数
|----------------|--------------------------------------------------------------------------------------------------------------------------------|
| input | * 一个大小为T×B×*的张量 * T是最长序列的长度 * B是批次大小 * *表示任意数目的维度 |
| lengths | 每个批次元素的序列长度的列表 |
| batch_first | 如果batch_first
是True,那么期望的输入格式是B x T x * |
| enforce_sorted | 如果设置了enforce_sorted=True
,序列应该按长度降序排列。这意味着input[:,0]
应该是最长的序列,input[:,B-1]
应该是最短的。 如果enforce_sorted
设置为False,输入序列将无条件地被排序。 |
1.4 举例
python
import torch
from torch.nn.utils.rnn import pack_padded_sequence
# 输入序列
input_seq = torch.tensor([[6, 8, 9, 0], [5, 7, 0, 0], [1, 0, 0, 0]])
# 序列的实际长度
lengths = [3, 2, 1]
# 使用pack_padded_sequence
packed = pack_padded_sequence(input_seq, lengths, batch_first=True)
packed
#PackedSequence(data=tensor([6, 5, 1, 8, 7, 9]), batch_sizes=tensor([3, 2, 1]), sorted_indices=None, unsorted_indices=None)
2 pad_packed_sequence
对一个已打包的序列进行解包,这个打包的序列通常是通过pack_padded_sequence
函数从一个填充的序列得到的
2.1 基本使用方法
python
torch.nn.utils.rnn.pad_packed_sequence(
sequence,
batch_first=False,
padding_value=0.0,
total_length=None)
2.2 参数说明
|---------------|----------------------------------------------------|
| sequence | 要解包的已打包序列 |
| batch_first | 指示输出的维度顺序。如果为True,输出将为B x T x *格式,否则为T x B x *格式 |
| padding_value | 用于填充的值,通常是0 |
| total_length | 可选的。如果指定,输出序列将被填充到这个长度 |
2.3 举例
还是之前的packed
python
from torch.nn.utils.rnn import pad_packed_sequence
pad_packed_sequence(packed)
'''
(tensor([[6, 5, 1],
[8, 7, 0],
[9, 0, 0]]),
tensor([3, 2, 1]))
'''
pad_packed_sequence(packed, batch_first=True,total_length=5)
'''
(tensor([[6, 8, 9, 0, 0],
[5, 7, 0, 0, 0],
[1, 0, 0, 0, 0]]),
tensor([3, 2, 1]))
'''