返回Tensorflow中来自tf.multinomial的样本的相关概率

时间:2018-02-10 19:35:17

标签: python tensorflow

我使用tf.multinomial在Tensorflow中生成样本,并且我正在寻找一种方法来返回随机选择元素的相关概率。所以在以下情况中:

logits = [[-1., 0., 1], [1, 1, 1], [0, 1, 2]]
samples = tf.multinomial(logits, 2)

with tf.Session() as sess:
    sess.run(samples)

而不是

[[1, 2], [0, 1], [1, 1]]

结果,我希望看到类似

的内容
[[(1, 0.244728), (2, 0.66524)], 
 [(0, 0.33333), (1, 0.33333)], 
 [(1, 0.244728), (1, 0.244728)]]

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

我很困惑,tensorflow是否在内部进行某种转换,从而将您的logit转换为概率?多项式分布将一组位置概率作为参数,该概率概率确定(位置上)被采样结果的可能性。即

# this is all psuedocode
x = multinomial([.2, .3, .5])
y ~ x
# this will give a value of 0 20% of the time
# a value of 1 30% of the time
# and a value of 2 50% of the time

因此,您的概率可能就是您的登录记录。

看着https://www.tensorflow.org/api_docs/python/tf/multinomial

您看到它指出它们是“未归一化的对数概率”,因此,如果您可以应用该转换,那么您就有了概率

答案 1 :(得分:0)

您可以尝试var arr = new[] { 12, 48, 50, 100 }; int nearest = GetNearest(1, arr); nearest = GetNearest(40, arr); nearest = GetNearest(49, arr); nearest = GetNearest(70, arr); nearest = GetNearest(1005, arr); int GetNearest(int number, int[] array) { int diff = int.MaxValue; int result = 0; foreach (var item in array) { var abs = Math.Abs(item - number); if (abs == 0) { result = item; break; } if (abs <= diff) { diff = abs; result = item; } } return result; } ,可以尝试

tf.gather_nd

或者,您可以使用tf.distributions.Multinomial,优点是您不需要关心以上代码中的>>> import tensorflow as tf >>> tf.enable_eager_execution() >>> probs = tf.constant([[0.5, 0.2, 0.1, 0.2], [0.6, 0.1, 0.1, 0.1]], dtype=tf.float32) >>> idx = tf.multinomial(probs, 1) >>> row_indices = tf.range(probs.get_shape()[0], dtype=tf.int64) >>> full_indices = tf.stack([row_indices, tf.squeeze(idx)], axis=1) >>> rs = tf.gather_nd(probs, full_indices) 。设置batch_size时,它可以在变化的batch_size下工作。这是一个简单的例子,

batch_size=None

我认为这是您想要做的。我更喜欢后者,因为它灵活而优雅。