tensorflow的网站给出了这个例子
tf.random.categorical(tf.log(10。,10.),5)产生一个“具有形状[1,5]的张量,其中每个值为0或1,概率相等”
我有 …
如你所知, tf.random.categorical 有两个参数:
tf.random.categorical
logits
[batch_size, num_classes]
num_samples
输出是具有形状的2D整数张量 [batch_size, num_samples] 。
[batch_size, num_samples]
每个“行”的 logits 张量( logits[0, :] , logits[1, :] ,...)表示不同的事件概率 分类分布 。但是,该函数不期望实际概率值,而是非标准化的对数概率;所以实际的概率是 softmax(logits[0, :]) , softmax(logits[1, :]) 这样做的好处是你可以基本上给出任何实际值作为输入(例如神经网络的输出),它们将是有效的。此外,使用对数使用特定的概率值或比例是微不足道的。例如,两者 [log(0.1), log(0.3), log(0.6)] 和 [log(1), log(3), log(6)] 表示相同的概率,其中第二类是第一类的三倍,但只有第三类的可能性的一半。
logits[0, :]
logits[1, :]
softmax(logits[0, :])
softmax(logits[1, :])
[log(0.1), log(0.3), log(0.6)]
[log(1), log(3), log(6)]
对于每行(非标准化log-)概率,你得到 num_samples 来自分布的样本。每个样本之间是一个整数 0 和 num_classes - 1 ,根据给定的概率绘制。因此结果是具有形状的2D张量 [batch_size, num_samples] 每个分布的采样整数。
0
num_classes - 1
编辑:功能的一个小例子。
import tensorflow as tf with tf.Graph().as_default(), tf.Session() as sess: tf.random.set_random_seed(123) logits = tf.log([[1., 1., 1., 1.], [0., 1., 2., 3.]]) num_samples = 30 cat = tf.random.categorical(logits, num_samples) print(sess.run(cat)) # [[3 3 1 1 0 3 3 0 2 3 1 3 3 3 1 1 0 2 2 0 3 1 3 0 1 1 0 1 3 3] # [2 2 3 3 2 3 3 3 2 2 3 3 2 2 2 1 3 3 3 2 3 2 2 1 3 3 3 3 3 2]]
在这种情况下,结果是一个包含两行和30列的数组。第一行中的值是从每个类的分类分布中采样的( [0, 1, 2, 3] )具有相同的概率。在第二行,类 3 是最有可能的一个,和班级 0 没有被采样的可能性。
[0, 1, 2, 3]
3