函数原型:tf.boolean_mask(tensor,mask,name='boolean_mask',axis=None)
跟numpy里面的tensor[mask]具有相同的功能。
参数:tensor是N维度的tensor,mask是K维度的,注意K小于等于N,name可选项也就是这个操作的名字,axis是一个0维度的int型tensor,表示的是从参数tensor的哪个axis开始mask,默认的情况下,axis=0表示从第一维度进行mask,因此K+axis小于等于N。
返回的是N-K+1维度的tensor,也就是mask为True的地方保存下来。
一般来说,0<dim(mask)=K<=dim(tensor),mask的大小必须匹配参数tensor的shape的前K维度。
在做目标检测(YOLO)时涉及到一个函数boolean_mask(a,b) 将使a (m维)矩阵仅保留与b中“True”元素同下标的部分。使用tf.boolean_mask用来过滤概率值比较低的锚盒,这个函数的一个参数b为滤波器掩模,生成掩模要用到逻辑表达式(>或者<)生成布尔值,假设阈值threshold=C,并且当mask和tensor的维度相同时,输出1维矩阵。
代码如下:
import tensorflow as tf
import numpy as np
a=tf.constant([
[[2,4],[4,1]],
[[6,8],[2,1]]
],tf.float32)
b=tf.reduce_max(a,-1)
c=a>2
with tf.Session() as sess:
print("a="+ str(sess.run(a)))
print("b=" + str(sess.run(b)))
print("c=" + str(sess.run(c)))
d=tf.boolean_mask(a,c)
print("d="+str(d.eval(session=sess)))
print(d.shape)
sess.close()
运行结果如下:
a=[[[2. 4.]
[4. 1.]]
[[6. 8.]
[2. 1.]]]
b=[[4. 4.]
[8. 2.]]
c=[[[False True]
[ True False]]
[[ True True]
[False False]]]
d=[4. 4. 6. 8.]
(?,)
布尔类型张量作为滤波器掩模,过滤掉我们不想要的的值。
最后d的值为[4,4,6,8]
d.shape=(?,)
假设tensor.rank=4(m,n,p,q),mask.rank必须满足4/3/2/1
(1)当mask.shape=(m,n,p,q),结果返回(?,)
(2)当mask.shape=(m,n,p),结果返回(?,q)
(3)当mask.shape=(m,n),结果返回(?,p,q)
(4)当mask.shape=(m),结果返回(?,n,p,q)