1. 引言
RNN模型一般设定固定的文本长度(text sequence length,可理解为文本序列在时间维度上的步数 time step),以保证网络输出层数据维度的一致性。但在训练和测试时,难以保证输入文本长度的一致性,因此常常需要截断操作(即将超过预设长度的文本截断)和pad操作(即对不足预设长度的文本进行补0填充)。pad操作需满足:
(1)pad后,不足预设长度的文本用相同特征维度的0填充;
(2)pad的部分不参与forward和backward计算。
Pytorch中,在文本数据的transfrom以及RNN网络的输入阶段,均充分考虑了pad操作。其主要体现在:
(1)RNN、LSTM和GRU等网络的输入数据均可为PackedSequence类型数据;
(2)可通过pad_sequence、pack_sequence、pack_padded_sequence和pad_packed_sequence等操作,实现pad和pack操作。
2. pack和pad操作
那么,究竟pad和pack操作对原始数据会有何影响?下面通过一个简单的示例来体现。
from torch.nn.utils.rnn import pack_sequence, pad_sequence,pad_packed_sequence, pack_padded_sequence,
text1 = torch.tensor([1,2,3,4]) # 可视为有4个文字的样本
text2 = torch.tensor([5,6,7]) # 可视为有3个文字的样本
text3 = torch.tensor([8,9]) # 可视为有2个文字的样本
sequences = [text1, text2, text3] # 三个文本序列
2.1 pack操作
[Input] pack_sequence(sequences)
[Output] PackedSequence(data=tensor([1, 5, 8, 2, 6, 9, 3, 7, 4]), batch_sizes=tensor(

最低0.47元/天 解锁文章
1121

被折叠的 条评论
为什么被折叠?



