pack/pad_packed_sequence

2019-06-29上午
cs224n assignment4

A 为什么要进行pack?!就是对pad_token的删除及填充操作,避免rnn计算不必要的pad-token

1,pack_padded_sequence(删去pad-token)-官网链接

1_a,具体形式

torch.nn.utils.rnn.pack_padded_sequence(input, lengths, batch_first=False, enforce_sorted=True)

1_b,使用方法&参数含义
参数意义
input (tensor)T x B x *张量,T是batch中最长序列的长度,B是batch_size, 星号为任意维度,一般是词向量的长度
lengths (tensor)batch中每个序列的长度所组成的列表
batch_first (bool)True:则input形状为B x T x *,默认为false
enforce_sorted (bool)True:则input中序列必须按其长度降序排序,默认为True
1_c,返回值

packedsequence 对象

2,pad_packed_sequence(填充pad-token)

2_a, 具体形式torch.nn.utils.rnn.pad_packed_sequence(sequence, batch_first=False, padding_value=0.0, total_length=None)
2_b, 使用方式&参数意义
参数意义
sequence等待填充的序列,一般是rnn的输出张量
padding_value填充值
total_length (int, optional)目标填充长度,注意这个值不能小于原来的batch中最长序列的长度,一般在nlp中设置为None即可(不需要调用)
2_c,返回值

tuple(填充后的张量,batch中序列长度列表(张量))

B,示例代码

'''
X:是一个batch的sequence,sequence是一个句子,句子中的每个词首先转成词向量
enc_hiddens:encoder(BiLSTM)层中的隐藏状态
h : 隐藏状态长度
X = self.model_embeddings.source(source_padded.permute(1, 0))   #(B,T,*)
X = X.permute(1, 0, 2)   #(T, B, *)
enc_hiddens, (last_hidden, last_cell) = self.encoder(pack_padded_sequence(X, source_lengths))
enc_hiddens, _ = pad_packed_sequence(enc_hiddens)  # (T, B, h * 2)  h*2是因为双向LSTM


版权声明:本文为NewDreamstyle原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。