给定形状为Nx2
的张量,如何从这个张量中选择类似于k
的{{1}}元素(概率相等)?另一点需要注意的是np.random.choice
的值在执行期间会动态变化。这意味着我正在处理一个动态大小的张量。
答案 0 :(得分:0)
您可以将np.random.choice
包裹为tf.py_func
。例如,见answer。在您的情况下,您需要展平张量,因此它是一个长度为2*N
的数组:
import numpy as np
import tensorflow as tf
a = tf.placeholder(tf.float32, shape=[None, 2])
size = tf.placeholder(tf.int32)
y = tf.py_func(lambda x, s: np.random.choice(x.reshape(-1),s), [a, size], tf.float32)
with tf.Session() as sess:
print(sess.run(y, {a: np.random.rand(4,2), size:5}))
答案 1 :(得分:0)
我遇到了类似的问题,我想从点云中对点进行子采样以实现 PointNet。我的输入维度是 [None, 2048, 3]
,我正在使用以下自定义层子采样到 [None, 1024, 3]
:
class SubSample(Layer):
def __init__(self,num_samples):
super(SubSample, self).__init__()
self.num_samples=num_samples
def build(self, input_shape):
self.shape = input_shape #[None,2048,3]
def call(self, inputs, training=None):
k = tf.random.uniform([self.shape[1],]) #[2048,]
bl = tf.argsort(k)<self.num_samples #[2048,]
res = tf.boolean_mask(inputs, bl, axis=1) #[None,1024,3]
# Reshape needed so that channel shape is passed when `run_eagerly=False`, otherwise it returns `None`
return tf.reshape(res,(-1,self.num_samples,self.shape[-1])) #[None,1024,3]
SubSample(1024)(tf.random.uniform((64,2048,3))).shape
>>> TensorShape([64, 1024, 3])
据我所知,这适用于 TensorFlow 2.5.0
请注意,这不是手头问题的直接答案,而是我偶然发现这个问题时正在寻找的答案。