Python 有人能举个小例子来解释tf.random.category的参数吗?

Python 有人能举个小例子来解释tf.random.category的参数吗?,python,tensorflow,Python,Tensorflow,tensorflow的网站给出了这个例子 tf.random.categorical(tf.log([[10., 10.]]), 5) 生成一个“具有形状[1,5]的张量,其中每个值的概率为0或1” 我已经知道了tf.log([[10,10.]])的基本含义 我想知道的是[batch_size,num_classes]做了什么,有人能举一个小例子来解释参数吗?正如您所指出的,有两个参数: logits,一种二维浮点张量,具有形状[批量大小,数量类] num\u samples,一个整数标量

tensorflow的网站给出了这个例子

tf.random.categorical(tf.log([[10., 10.]]), 5)
生成一个“具有形状[1,5]的张量,其中每个值的概率为0或1”

我已经知道了
tf.log([[10,10.]])
的基本含义

我想知道的是[batch_size,num_classes]做了什么,有人能举一个小例子来解释参数吗?

正如您所指出的,有两个参数:

  • logits
    ,一种二维浮点张量,具有形状
    [批量大小,数量类]
  • num\u 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)]
表示相同的概率,其中第二类的概率是第一类的三倍,但只有第三类的一半

对于每一行(非标准化的对数)概率,您将从分布中获得
num\u samples
samples。每个样本是一个介于
0
num_class-1
之间的整数,根据给定的概率绘制。因此,结果是二维张量,其形状
[batch\u size,num\u 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
没有被抽样的可能性。

希望这个简单的例子能有所帮助

tf.random.category
采用两个参数:

  • logits
    ,带有形状
    [批量大小,数量类]
  • num_样本
例:

list_index.shape=(4,10)

sampled\u index=tf.random.categorical(列表索引,num\u samples=1)

样本索引

tf.Tensor(
[[2]
 [9]
 [4]
 [7]], shape=(4, 1), dtype=int64)

这意味着从
10
num\u类中抽取
1
num\u样本
,用于
4
行中的每一行(
batch\u size

第二行的概率发生了什么变化,使得
3
最有可能和
0
没有被抽样的概率?@mLstudent33正如我在回答中试图解释的那样,每行上每个元素的概率都计算为给定值的softmax。由于第二行中的值是
[log(0)、log(1)、log(2)、log(3)]
(这里
log(0)
可以被视为负无穷大),概率将是
[0,0.2,0.4,0.6]
。当我这样做时:
来自scipy.special import softmax np。设置打印选项(精度=5)import numpy as np import tensorflow as tf x=np.array([0,1,2,3.])print(x)x=np.log(x)print(x)probs=softmax(x)print(probs)
我得到了不同的概率
[0.0.16667 0.33333 0.5]
@mLstudent33你是对的,对不起,这些概率是正确的(我之前计算的概率加起来是1.2,而不是1)。重点是保持值之间的比例(值3是值1的三倍)。@jdehesa为什么应该有日志操作,我看到许多网络架构,它们的“logits”只是最后一层的原始输出。例如,
logits=keras.layers.Dense(输出大小)
,然后使用
tf.random.category(logits,1)
选择一个或多个。是否有
log
softmax
操作符内部
tf.random.category(logits,1)
?您是否知道
[-1,0].numpy()参数在这里:
predicted\u id=tf.random.categorical(predictions,num\u samples=1)[-1,0].numpy()
可在此处的Colab笔记本中找到:?