我使用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)]]
有没有办法实现这个目标?
答案 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
我认为这是您想要做的。我更喜欢后者,因为它灵活而优雅。