欢迎访问宙启技术站
智能推送

如何使用pad_sequence()函数对序列进行填充和截断

发布时间:2023-12-27 03:06:41

pad_sequence()函数是torch.nn.utils.rnn模块中的一个函数,它用于将一组变长序列填充到相同长度,并可选择对其进行截断。

具体使用方法如下:

torch.nn.utils.rnn.pad_sequence(sequences, batch_first=False, padding_value=0)

参数解释:

- sequences:要进行填充的变长序列列表,列表中每个元素都是一个Tensor,大小为(T, *),其中T是该序列的长度,*可以是任意维度。列表中的序列会被自动填充为长度最长的那个序列。

- batch_first:是否将batch维放在最前面,默认为False。

- padding_value:对变长序列填充的值,默认为0。

使用示例:

假设我们有如下三个长度不一的序列:

seq1 = [1, 2, 3]
seq2 = [4, 5]
seq3 = [6, 7, 8, 9]

我们可以将它们以列表的形式传给pad_sequence()函数,如下所示:

import torch
from torch.nn.utils.rnn import pad_sequence

sequences = [torch.tensor(seq1), torch.tensor(seq2), torch.tensor(seq3)]
padded_seqs = pad_sequence(sequences)

print(padded_seqs)

输出结果为:

tensor([[1, 2, 3, 0],
        [4, 5, 0, 0],
        [6, 7, 8, 9]])

可以看到,序列中的较短部分被填充为0,长度变为与最长序列相同。默认情况下,填充的值为0,可以通过设置padding_value参数来指定其他填充值。

如果将batch_first参数设置为True,输出结果将会转置,如下所示:

padded_seqs = pad_sequence(sequences, batch_first=True)

print(padded_seqs)

输出结果为:

tensor([[1, 2, 3, 0],
        [4, 5, 0, 0],
        [6, 7, 8, 9]])

在使用pad_sequence()函数时,可以对序列进行截断,只保留一定长度的部分。例如,我们希望将超过长度为3的序列进行截断,可以在构建Tensor时将较长的序列进行切片,然后再使用pad_sequence()函数进行填充。示例如下:

seq1 = [1, 2, 3, 4, 5]
seq2 = [6, 7, 8]
seq3 = [9, 10, 11, 12]

sequences = [torch.tensor(seq1[:3]), torch.tensor(seq2[:3]), torch.tensor(seq3[:3])]
padded_seqs = pad_sequence(sequences)

print(padded_seqs)

输出结果为:

tensor([[ 1,  2,  3],
        [ 6,  7,  8],
        [ 9, 10, 11]])

可以看到,序列的长度被截断为指定的长度,再进行填充。

总结:

通过pad_sequence()函数,我们可以方便地对一组变长序列进行填充和截断,使它们都具有相同的长度。这对于处理序列数据时,特别是在进行批处理时,非常有用。