pytorch中pad和pack操作使用詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM