1. pad_sequece操作
先来看一下官方的定义:
其中sequence是我们要进行pad操作的序列,该参数是一个list列表,列表的元素是一个一个tensor。
batch_first=True说明第一个维度是batch_size,默认为False;
padding_value的值是用来填充的值;
下面是一个具体使用示例:
import torch
import torch.nn as nn
test_in = [torch.Tensor([2,3,4,5]),torch.Tensor([6,5,4]),torch.Tensor([5,6,8])]#可依次看做有4个,3个,3个单词的文本,一般情况下我们需要将其进行排序,将最长的放在前面
pad = nn.utils.rnn.pad_sequence(test_in,batch_first=True,padding_value=-1)
print('pad:',pad)
程序运行结果如下所示:
pad: tensor([[ 2., 3., 4., 5.],
[ 6., 5., 4., -1.],
[ 5., 6., 8., -1.]])
2. pack_padded_sequence操作
该操作是将pad过的句子进行压缩,然后送进网络进行训练,避免了无用的数据送入网络;
先来看一下官网的定义:
其中input就是我们上面经过pad后的结果;
length就是哥哥元素本来的长度
使用示例:
length = [4,3,3]
pack= nn.utils.rnn.pack_padded_sequence(pad,length,batch_first=True)
print('pack:',pack)
程序运行结果如下:
pack: PackedSequence(data=tensor([2., 6., 5., 3., 5., 6., 4., 4., 8., 5.]), batch_sizes=tensor([3, 3, 3, 1]), sorted_indices=None, unsorted_indices=None)
3. pad_packed_sequence操作
该操作用于将上面pack过的再pad过来,
使用示例入下:
pad_packed = nn.utils.rnn.pad_packed_sequence(pack,batch_first=True)
print(pad_packed)
运行结果如下:
(tensor([[2., 3., 4., 5.],
[6., 5., 4., 0.],
[5., 6., 8., 0.]]), tensor([4, 3, 3]))