最常見的一種情況, 在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
層中, 將token
由id
轉換成對應的vector
. 我們希望被填補的0值在後續的計算中不產生影響, 就可以在初始化embedding
層時指定引數mask_zero
為true
, 意思就是遮蔽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...