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