我正在研究 PointNet++ 的实现,其中一个步骤是找到r
围绕质心列表的半径中的所有点。我可以创建一个布尔掩码,判断每个点是否在r
每个质心的单位内,但是当我尝试从该布尔掩码创建一个参差不齐的张量时,我的None
维度比我应该的要多。
我有两个张量,x
它们是点并且具有形状(batch_size,num_points,xyz_pos)
,并且mask
具有形状(batch_size,num_points,num_centroids)
。(batch_size,centroids,(num_selected_points),xyz_pos)
当我完成时,理想情况下我想要num_selected_points
一个参差不齐的形状。目前,我正在尝试实现这一点,(num_centroids,batch_size,(num_selected_points),xyz_pos)
因为该功能更简单,而且我在参差不齐的尺寸方面遇到了麻烦。
出于某种原因,我的代码导致(num_centroids,(batch_size),(num_selected_points),xyz_pos)
, 其中batch_size
和num_selected_points
都是参差不齐的尺寸。这对我来说似乎很奇怪,因为(如下面的代码所示),batch_size
维度的长度是恒定的。这似乎是 TensorFlow 处理不规则张量的方式的副作用map_fn
,但我不确定。我怎样才能确保只有一个维度 ( num_selected_points
) 是参差不齐的,而所有其他维度都是不变的?
@tf.function
def test(x,mask):
mask = tf.transpose(mask,perm=(2,0,1))
rts = tf.RaggedTensorSpec(shape=(x.shape[0],None,x.shape[-1]),ragged_rank=1,dtype=tf.float32)
vals = tf.map_fn(lambda m : tf.ragged.boolean_mask(x,m), mask,fn_output_signature=rts)
return vals
mask=tf.random.uniform((10,1000,2,))>0.5
x=tf.random.uniform((10,1000,3))
res = test(x,mask)
print(res.shape,[r.shape for r in res])
>>> (2, None, None, 3) [TensorShape([10, None, 3]), TensorShape([10, None, 3])]
# should be (2, 10, None, 3)