0

我正在研究 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_sizenum_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)
4

0 回答 0