一: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)
- 當參數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)
- 當參數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維。