tensorflow的站点给出了这个例子
tf.random.categorical(tf.log([[10., 10.]]), 5)
生成“has shape[1,5]的张量,其中每个值都是0或1,概率相等”
我已经知道了,基本的demo,
tf.log([[10., 10.]])
的含义。我想知道的是[批量大小,数值类]是做什么的,有人能举个小例子来解释参数吗?
最佳答案
正如您所注意到的,tf.random.categorical
有两个参数:logits
,一个形状[batch_size, num_classes]
的二维浮子张量num_samples
,整数标量。
输出是一个形状[batch_size, num_samples]
的二维整数张量。logits
张量(logits[0, :]
,logits[1, :]
,…)的每个“行”表示不同categorical distribution的事件概率。但是,该函数并不期望实际的概率值,而是不规范的对数概率;因此实际的概率将是softmax(logits[0, :])
,softmax(logits[1, :])
,等等。这样做的好处是,您可以基本上给出任何实际值作为输入(例如,神经网络的输出),它们将是有效的。另外,使用特定的概率值或比例,使用对数是很简单的。例如,[log(0.1), log(0.3), log(0.6)]
和[log(1), log(3), log(6)]
都表示相同的概率,其中第二类的概率是第一类的三倍,但只有第三类的一半。
对于每一行(非正规对数)概率,您可以从分布中获得num_samples
样本。根据给定的概率,每个样本都是0
和num_classes - 1
之间的整数。因此,结果是二维张量的形状[batch_size, num_samples]
与每个分布的采样整数。
编辑:函数的一个小例子。
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
类没有被采样的可能性。