tf中幾種mask的介紹


一:tf.sequence_mask()函數

這個函數目前我主要用於數據填充時候使用。

 

 

1.函數介紹

這個是官方定義,耐心看完解釋再看后面的例子,你會一下就懂了。

 

# 函數定義
sequence_mask(
    lengths,
    maxlen=None,
    dtype=tf.bool,
    name=None
)
# 返回數據
return mask類型數據

2.參數解釋
函數返回的一個mask張量,默認其中內部元素類型是tf.bool(布爾變量)
經過tf.Session()打印可以得到一個array數據。
注解:一般實際代碼中選擇數據類型為tf.float32,這樣True會變成1.,同理False變成0.,看不懂可以繼續往下看

要點解釋:
1.返回值mask張量:默認mask張量就是布爾格式的一種張量表達,只有True和 False 格式,也可以通過參數dtype指定其他數據格式。

2.參數lengths:顧名思義表示的是長度;可以是標量,也可以是列表 [ ] ,也可以是二維列表[ [ ],[ ] ,…],甚至是多維列表…。一般列表類型的用的比較多

3.參數maxlen:當默認None,默認從lengths中獲取最大的那個數字,決定返回mask張量的長度;當為N時,返回的是N長度。
如果覺得晦澀,舉例,看完就懂了:

3.函數舉例
當參數lenghts是標量

import tensorflow as tf

lenght = 4 
mask_data = tf.sequence_mask(lengths=lenght)
# 輸出結果,輸出結果是長度為4的array,前四個True
array([ True,  True,  True,  True])

# 定義maxlen時
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6)
# 輸出結果,輸出結果是長度為6的array,前四個True
array([ True,  True,  True,  True, False, False])

# 定義dtype時
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6,dtype=tf.float32)
# 輸出結果,輸出結果是長度為6的array,前四個1.0
array([1., 1., 1., 1., 0., 0.], dtype=float32)
  1. 當參數lenghts是[ list ],這個形式的非常常用,主要是針對數據填充用的非常多。比如我一個batch_data有10個數據,每個數據是一個句子,每個句子不可能是一樣長的,肯定有短的需要填充0元素,那么lengths就專門記錄每個句子的長度的。
# 比如這個lenght就是記錄了第一個句子2個單詞,第二個句子2個單詞,第三個句子4個單詞
lenght = [2,2,4] 
mask_data = tf.sequence_mask(lengths=lenght)
# 長度為max(lenght)
array([[ True,  True, False, False],
       [ True,  True, False, False],
       [ True,  True,  True,  True]])

# 定義maxlen時
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6)
# 長度為maxlen
array([[ True,  True, False, False, False, False],
       [ True,  True, False, False, False, False],
       [ True,  True,  True,  True, False, False]])

# 定義dtype時
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6,dtype=tf.float32)
# 長度為maxlen,數據格式為float32
array([[1., 1., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 1., 0., 0.]], dtype=float32)
  1. 當參數lenghts是[[ list ]…] 在NLP中用的比較少,我就舉一個例子
lenght = [[2,2,4],[3,4,5]]
mask_data = tf.sequence_mask(lengths=lenght)
# 輸出
array([[[ True,  True, False, False, False],
        [ True,  True, False, False, False],
        [ True,  True,  True,  True, False]],

       [[ True,  True,  True, False, False],
        [ True,  True,  True,  True, False],
        [ True,  True,  True,  True,  True]]])

4.注意事項和應用場景
這個填充很多時候lenghts不是我們舉例子這樣使用的固定長度length,大多數時候都是使用了tf.data.Dataset得到的數據。

應用場景主要是在填充計算時候使用,比如你把沒有單詞的位置填充了0,如果納入了前向傳播計算,影響了最終經驗損失函數的結果。那么我們如果通過tf.sequence_mask得到的mask張量,與損失函數結果進行對照相乘,可以去掉無用的損失值,保證了計算的准確性

 

一:tf.boolean_mask()函數

tensorflow 里的一個函數,在做目標檢測(YOLO)時常常用到。

其中b一般是bool型的n維向量,若a.shape=[3,3,3]    b.shape=[3,3]    

則  tf.boolean_mask(a,b) 將使a (m維)矩陣僅保留與b中“True”元素同下標的部分,並將結果展開到m-1維。

例:應用在YOLO算法中返回所有檢測到的各類目標(車輛、行人、交通標志等)的位置信息(bx,by,bh,bw)

下面用代碼類解釋:  

a = np.random.randn(3, 3, 3)
b = np.max(a,-1)
c=  b >0.5
print("a="+str(a))
print("b="+str(b))
print("c="+str(c))
with tf.Session() as sess:
    d=tf.boolean_mask(a,c)
print("d="+str(d.eval(session=sess)))

輸出:

a=[[[ 0.09155271  0.09282064  1.40717416]
  [-0.23405791  0.49668615 -2.04293241]
  [-1.88603236 -2.0345092   1.49677093]]

 [[-0.93868614 -0.12003641 -1.48570443]
  [-0.73984936 -0.85963706 -0.81079767]
  [ 1.28287865  2.00767207 -1.28853578]]

 [[-0.49265434 -0.50572453  0.31728808]
  [-0.24718764 -0.13105037 -0.87185338]
  [-0.43106541  0.52068668  1.54395911]]]
b=[[ 1.40717416  0.49668615  1.49677093]
 [-0.12003641 -0.73984936  2.00767207]
 [ 0.31728808 -0.13105037  1.54395911]]
c=[[ True False  True]
 [False False  True]
 [False False  True]]
d=[[ 0.09155271  0.09282064  1.40717416]
 [-1.88603236 -2.0345092   1.49677093]
 [ 1.28287865  2.00767207 -1.28853578]
 [-0.43106541  0.52068668  1.54395911]]

首先,a = np.random.randn(3,3,3)生成3*3*3的張量,其次b = np.max(a, -1)表示在最后一個軸(此時為2)的方向上去最大值,此時將3*3*3的張量變為3*3的張量,然后執行c = b>0.5,c的結果為一個3*3的布爾型張量。最后執行tf.boolean_mask(a,c),將使a (3維)張量僅保留與c中“True”元素同下標的部分,並將結果展開到2維。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM