日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

pytorch中如何处理RNN输入变长序列padding

發(fā)布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch中如何处理RNN输入变长序列padding 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、為什么RNN需要處理變長輸入

假設(shè)我們有情感分析的例子,對每句話進行一個感情級別的分類,主體流程大概是下圖所示:

思路比較簡單,但是當我們進行batch個訓(xùn)練數(shù)據(jù)一起計算的時候,我們會遇到多個訓(xùn)練樣例長度不同的情況,這樣我們就會很自然的進行padding,將短句子padding為跟最長的句子一樣。

比如向下圖這樣:

但是這會有一個問題,什么問題呢?比如上圖,句子“Yes”只有一個單詞,但是padding了5的pad符號,這樣會導(dǎo)致LSTM對它的表示通過了非常多無用的字符,這樣得到的句子表示就會有誤差,更直觀的如下圖:

那么我們正確的做法應(yīng)該是怎么樣呢?

這就引出pytorch中RNN需要處理變長輸入的需求了。在上面這個例子,我們想要得到的表示僅僅是LSTM過完單詞"Yes"之后的表示,而不是通過了多個無用的“Pad”得到的表示:如下圖:

二、pytorch中RNN如何處理變長padding

主要是用函數(shù)torch.nn.utils.rnn.pack_padded_sequence()以及torch.nn.utils.rnn.pad_packed_sequence()來進行的,分別來看看這兩個函數(shù)的用法。

?

這里的pack,理解成壓緊比較好。 將一個 填充過的變長序列 壓緊。(填充時候,會有冗余,所以壓緊一下)

輸入的形狀可以是(T×B×* )。T是最長序列長度,B是batch size,*代表任意維度(可以是0)。如果batch_first=True的話,那么相應(yīng)的 input size 就是 (B×T×*)。

Variable中保存的序列,應(yīng)該按序列長度的長短排序,長的在前,短的在后(特別注意需要進行排序)。即input[:,0]代表的是最長的序列,input[:, B-1]保存的是最短的序列。

參數(shù)說明:

input (Variable) – 變長序列 被填充后的 batch

lengths (list[int]) – Variable 中 每個序列的長度。(知道了每個序列的長度,才能知道每個序列處理到多長停止

batch_first (bool, optional) – 如果是True,input的形狀應(yīng)該是B*T*size。

返回值:

一個PackedSequence 對象。一個PackedSequence表示如下所示:

具體代碼如下:

embed_input_x_packed = pack_padded_sequence(embed_input_x, sentence_lens, batch_first=True)
encoder_outputs_packed, (h_last, c_last) = self.lstm(embed_input_x_packed)

此時,返回的h_last和c_last就是剔除padding字符后的hidden state和cell state,都是Variable類型的。代表的意思如下(各個句子的表示,lstm只會作用到它實際長度的句子,而不是通過無用的padding字符,下圖用紅色的打鉤來表示):

但是返回的output是PackedSequence類型的,可以使用:

encoder_outputs, _ = pad_packed_sequence(encoder_outputs_packed, batch_first=True)

將encoderoutputs在轉(zhuǎn)換為Variable類型,得到的_代表各個句子的長度。

三、總結(jié)

這樣綜上所述,RNN在處理類似變長的句子序列的時候,我們就可以配套使用torch.nn.utils.rnn.pack_padded_sequence()以及torch.nn.utils.rnn.pad_packed_sequence()來避免padding對句子表示的影響

參考:

總結(jié)

以上是生活随笔為你收集整理的pytorch中如何处理RNN输入变长序列padding的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。