从 TensorFlow 中给定的非均匀分布进行无放回采样
Sampling without replacement from a given non-uniform distribution in TensorFlow
我正在寻找类似于 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 中的非均匀分布中进行采样?
谢谢。
您可以只使用 tf.py_func
包装 numpy.random.choice
并将其作为 TensorFlow op 提供:
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.]
是的,有。有关一些背景信息,请参阅 here and here。解决方案是:
z = -tf.log(-tf.log(tf.random_uniform(tf.shape(p),0,1)))
_, indices = tf.nn.top_k(tf.log(p) + z, size)
我正在寻找类似于 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 中的非均匀分布中进行采样?
谢谢。
您可以只使用 tf.py_func
包装 numpy.random.choice
并将其作为 TensorFlow op 提供:
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.]
是的,有。有关一些背景信息,请参阅 here and here。解决方案是:
z = -tf.log(-tf.log(tf.random_uniform(tf.shape(p),0,1)))
_, indices = tf.nn.top_k(tf.log(p) + z, size)