Python 有人能举个小例子来解释tf.random.category的参数吗?
tensorflow的网站给出了这个例子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,一个整数标量
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笔记本中找到:?