在TensorFlow中无需替换给定的非均匀分布即可进行抽样

问题描述 投票:8回答:2

我正在寻找类似于numpy.random.choice(range(3),replacement=False,size=2,p=[0.1,0.2,0.7])的东西 在TensorFlow中。

最接近它的Op似乎是tf.multinomial(tf.log(p)),它将logits作为输入,但它不能在没有替换的情况下进行采样。在TensorFlow中,是否还有其他方法可以从非均匀分布中进行采样?

谢谢。

random tensorflow choice multinomial
2个回答
2
投票

您可以使用tf.py_func来包装numpy.random.choice并使其可用作TensorFlow操作:

a = tf.placeholder(tf.float32)
size = tf.placeholder(tf.int32)
replace = tf.placeholder(tf.bool)
p = tf.placeholder(tf.float32)

y = tf.py_func(np.random.choice, [a, size, replace, p], tf.float32)

with tf.Session() as sess:
    print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))

您可以像往常一样指定numpy种子:

np.random.seed(1)
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
np.random.seed(1)
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))
np.random.seed(1)
print(sess.run(y, {a: range(3), size: 2, replace:False, p:[0.1,0.2,0.7]}))

会打印:

[ 2.  0.]
[ 2.  1.]
[ 0.  1.]
[ 2.  0.]
[ 2.  1.]
[ 0.  1.]
[ 2.  0.]

0
投票

就在这里。有关背景信息,请参阅herehere。解决方案是:

z = -tf.log(-tf.log(tf.random_uniform(tf.shape(p),0,1))) 
_, indices = tf.nn.top_k(tf.log(p) + z, size)
© www.soinside.com 2019 - 2024. All rights reserved.