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]))