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版权协议,转载请附上原文出处链接和本声明。