Keras 筆記之Mask層

2021-08-20 13:45:29 字數 1421 閱讀 3238

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層

model = sequential()

model.add(masking(mask_value=0., input_shape=(timesteps, features)))

model.add(lstm(32))

在用lstm等模型處理文字資料時,因為文字是變長的,所以在處理的過程中,要先進行長度的統一。常用的方法為

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...