1. 程式人生 > >pytorch的pack和unpack函式

pytorch的pack和unpack函式

pack
unpack

匯入

from torch.nn.utils.rnn import pack_padded_sequence as pack
from torch.nn.utils.rnn import pad_packed_sequence as unpack

使用方法舉例

 embs = pack(self.embedding(inputs), lengths)
 outputs, state = self.rnn(embs)
 outputs = unpack(outputs)[0]

轉載

pytorch RNN 變長輸入 padding

用RNN(包括LSTM\GRU等)做NLP任務時,對於同一個batch內的短句子一般需要padding補齊,這些padding的字元一般不應該拿去算output、hidden state、loss…的。

TensorFlow中已經實現了RNN的變長輸入,只需要在呼叫RNN時指定batch內各sequence的length即可:RNN(input, length…)。但在pytorch中就會麻煩一些。

當輸入只有一個時,即forward中只有一個x: def forward(self, x):…,此時非常簡單,只需要在呼叫RNN之前用torch.nn.utils.rnn.pack_padded_sequence(input, length) 對x進行包裝即可,這裡,需要注意的是x內的seq需要按長度降序排列。形如:

x_emb = self.emb(x)
x_emb_p = torch.nn.utils.rnn.pack_padded_sequence(x_emb, xlen, batch_first=True)
out_pack, (ht, ct) = self.rnn(x_1_emb_p, None)

此時,返回的ht和ct就是剔除padding字元後的hidden state和cell state,都是Variable型別的。但是返回的outputPackedSequence型別的,可以使用:

out = torch.nn.utils.rnn.pad_packed_sequence(out_pack, batch_first=True)

將output轉化成tuple:(padded sequence, sequence lengths)。