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维。