keras keras中的mask操作

2021-09-04 02:28:12 字數 2648 閱讀 3200

最常見的一種情況, 在nlp問題的句子補全方法中, 按照一定的長度, 對句子進行填補和擷取操作. 一般使用keras.preprocessing.sequence包中的pad_sequences方法, 在句子前面或者後面補0. 但是這些零是我們不需要的, 只是為了組成可以計算的結構才填補的. 因此計算過程中, 我們希望用mask的思想, 在計算中, 遮蔽這些填補0值得作用. keras中提供了mask相關的操作方法.

在keras中,tensor在各層之間傳遞,layer物件接受的上層layer得到的tensor, 輸出的經過處理後的tensor.

keras是用乙個mask矩陣來參與到計算當中, 決定在計算中遮蔽哪些位置的值. 因此mask矩陣其中的值就是true/false, 其形狀一般與對應的tensor相同. 同樣與tensor相同的是,mask矩陣也會在每層layer被處理, 得到傳入到下一層的mask情況.

最直接的, 在nlp問題中, 對句子填補之後, 就要輸入到embedding層中, 將tokenid轉換成對應的vector. 我們希望被填補的0值在後續的計算中不產生影響, 就可以在初始化embedding層時指定引數mask_zerotrue, 意思就是遮蔽0值, 即填補的0值.

embedding層中的compute_mask方法中, 會計算得到mask矩陣. 雖然在embedding層中不會使用這個mask矩陣, 即0值還是會根據其對應的向量進行查詢, 但是這個mask矩陣會被傳入到下一層中, 如果下一層, 或之後的層會對mask進行考慮, 那就會起到對應的作用.

也可以在keras.layers包中引用masking類, 使用mask_value指定固定的值被遮蔽. 在呼叫call方法時, 就會輸出遮蔽後的結果.

需要注意的是masking這種層的compute_mask方法, 原始碼如下:

def

compute_mask

(self, inputs, mask=none):

output_mask = k.any(k.not_equal(inputs, self.mask_value), axis=-1)

return output_mask

可以看到, 這一層輸出的mask矩陣, 是根據這層的輸入得到的, 具體的說是會比輸入第乙個維度, 這是因為最後乙個維度被k.any(axis=-1)給去掉了. 在使用時需要注意這種操作的意義以及維度的變化.

更多的, 我們還是在自定義的層中, 需要支援mask操作, 因此需要對應的邏輯.

首先, 如果我們希望自定義的這個層支援mask操作, 就需要在__init__方法中指定:

self.supports_masking = true
如果在本層計算中需要使用到mask, 則call方法需要多傳入乙個mask引數, 即:

def

call

(self, inputs, mask=none):

pass

然後, 如果還要繼續輸出mask, 供之後的層使用, 如果不對mask矩陣進行變換, 這不用進行任何操作, 否則就需要實現compute_mask函式:

def

compute_mask

(self, inputs, mask=none):

pass

這裡的inputs就是輸入的tensor, 與call方法中接收到的一樣,mask就是上層傳入的mask矩陣.

如果希望mask到此為止, 之後的層不再使用, 則該函式直接返回none即可:

def

compute_mask

(self, inputs, mask=none):

return

none

keras自定義實現帶masking的meanpooling層

keras實現支援masking的flatten層

HAProxy客戶端IP位址的透傳 Masuri

haproxy客戶端ip位址的透傳 環境準備 server ipclient 172.20.27.10 haproxy 172.20.27.20,192.168.27.10 nginx 192.168.27.21 nginx操作 1.首先對nginx的主配置中的日誌做修改 root nginx vi...

Python中的descriptor中的一點疑問

在我的印象中,類中的函式是可以有兩種呼叫方式的,如下 class b def func self return 10 b b b.func b.func b 於是,在之前研究descriptor的時候,我就有了幾點困惑 我將 更換成了如下兩個版本 版本1 import time class lazy...

python中的dict Python中的dict

dict python內建了字典 dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵 值 key value 儲存,具有極快的查詢速度。d print dict get michael d michael add a element d adam 67 print d...