pytorch的pack和unpack函式
阿新 • • 發佈:2018-10-31
匯入
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]
轉載
用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型別的。但是返回的output是PackedSequence型別的,可以使用:
out = torch.nn.utils.rnn.pad_packed_sequence(out_pack, batch_first=True)
將output轉化成tuple:(padded sequence, sequence lengths)。