从Tensorflow中的张量中随机选择元素

从Tensorflow中的张量中随机选择元素,tensorflow,Tensorflow,给定形状为Nx2的张量,如何从该张量中选择类似于np.random.choice的k元素(概率相等)?另一点需要注意的是,N的值在执行过程中动态变化。意思是说我在处理一个动态大小的张量。你可以把np.random.choice包装成tf.py\u func。例如,请参见此示例。在本例中,需要展平张量,使其成为长度为2*N的数组: import numpy as np import tensorflow as tf a = tf.placeholder(tf.float32, shape=[No

给定形状为
Nx2
的张量,如何从该张量中选择类似于
np.random.choice的
k
元素(概率相等)?另一点需要注意的是,
N
的值在执行过程中动态变化。意思是说我在处理一个动态大小的张量。

你可以把
np.random.choice
包装成
tf.py\u func
。例如,请参见此示例。在本例中,需要展平张量,使其成为长度为
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}))

当我尝试运行此操作时,我得到一个
NameError:name'size'未定义
错误,这一行
print(sess.run(y,{a:np.random.rand(4,2),size:5}))
。知道这个问题吗?使用
tf.py_func
非常糟糕,因为调用python操作会大大降低计算速度。特别是如果您使用的是GPU,那么根据任务的不同,利用率可能会从100%下降到5%。您可以使用
tf.multinomial
,但是,该示例需要替换。如果不替换,则可能是不走运,因为我认为没有新的OP可以做到这一点——最好的是编写自定义的C++ OP。但是,可以通过反复从一个数组中采样一个元素来消除它,并通过“代码> TF之类的东西删除该元素。