keras 的mask層
先看下官方文件的解釋
masking層
keras.layers.core.masking(mask_value=0.0)
使用給定的值對輸入的序列訊號進行「遮蔽」,用以定位需要跳過的時間步
對於輸入張量的時間步,即輸入張量的第1維度(維度從0開始算,見例子),如果輸入張量在該時間步上都等於mask_value,則該時間步將在模型接下來的所有層(只要支援masking)被跳過(遮蔽)。
如果模型接下來的一些層不支援masking,卻接受到masking過的資料,則丟擲異常。
例子 考慮輸入資料x是乙個形如(samples,timesteps,features)的張量,現將其送入lstm層。因為你缺少時間步為3和5的訊號,所以你希望將其掩蓋。這時候應該:
賦值x[:,3,:] = 0.,x[:,5,:] = 0.
在lstm層之前插入mask_value=0.的masking層
在用lstm等模型處理文字資料時,因為文字是變長的,所以在處理的過程中,要先進行長度的統一。常用的方法為model = sequential()
model.add(masking(mask_value=0., input_shape=(timesteps, features)))
model.add(lstm(32))
x_data = sequence.pad_sequence(maxlen=10,value=0,padding='post')
此步驟將x_data統一長度為10.
如[1,2,3,4,5]–>變為[1,2,3,4,5,0,0,0,0,0]
這樣就可以把x_data 輸入到model的embedding等層。
然而,交給lstm處理時,還有對資料進行反padding.也就是把後面的0去掉。
這個時候就是mask層派上用場的時候了。mask(0)經過mask後,可以忽略x_data中所有的0,當然,把後面補的0去掉是可以理解的。那如果句中有0呢?一般情況下,如文字處理,會把文字對映成index,這樣最大的好處就是節約空間。有些大文字資料,幾百個g,經過了index對映,也就還剩幾個g。這是題外話了,我們在keras的embedding層會講的。而這個時候index中的0,往往是一些無法轉成詞向量的低頻詞,這些詞沒有詞向量,去掉對整個文字的處理也沒有影響,所以在mask中和補上的0一起忽略就好啦。
這裡的忽略是什麼意思呢?也就是不處理。
很多朋友以為mask後會直接把0去掉。其實不是的。
可以做一些實驗,如model的mask後接個lstm層,對lstm輸出每個時間步的值,發現,如果設定了mask層,則上面[1,2,3,4,5,00000]的資料處理結果,前5位是經過了計算,補0的對應的位置的值,和第5位的值相同,也就是說lstm對後面補0的位置並沒有計算。
對keras函式中mask的個人理解
由於keras中許多網路並不支援mask,但最近本菜需要在自己的網路中實現mask,如果想讓keras中的自定義函式支援mask,就必須要實現comput mask方法,因為在官方的文件中我並沒有找到想要的東西,因此只能通過看原始碼的方式來學習,下面這一段就是keras中masking層的原始碼 c...
Keras學習筆記02 常用的網路層
在搭建神經網路結構時,我們要向網路中新增一些網路層,下面列舉出來常用的網路層及其相關用法。常用層對應於core模組,core內部定義了一系列常用的網路層,包括全連線 啟用層等。1.dense層 dense層 全連線層。keras.layers.core.dense output dim,init g...
Keras 自定義層
keras自定義或者重寫層,需要實現三個方法 問題 參考 keras 自定義層 最後舉乙個conditional layer normalization的例子 基於conditional layer normalization的條件文字生成 自定義層需要實現三個方法 class layernorma...