2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
正如您所注意到的,tf.random.categorical
需要兩個參數(shù):
logits
, 具有形狀的 2D 浮動張量[batch_size, num_classes]
num_samples
,整數(shù)標量。
輸出是一個形狀為 的二維整數(shù)張量[batch_size, num_samples]
。
logits
張量 ( logits[0, :]
, logits[1, :]
, ...) 的每一“行”代表不同分類分布的事件概率。不過,該函數(shù)并不期望實際概率值,而是期望未歸一化的對數(shù)概率;所以實際的概率是softmax(logits[0, :])
,softmax(logits[1, :])
等等。這樣做的好處是你基本上可以給出任何實際值作為輸入(例如神經(jīng)網(wǎng)絡(luò)的輸出),它們將是有效的。此外,使用對數(shù)使用特定的概率值或比例也很簡單。例如,兩者[log(0.1), log(0.3), log(0.6)]
和[log(1), log(3), log(6)]
代表相同的概率,其中第二類的可能性是第一類的三倍,但只有第三類的一半。
對于(非標準化對數(shù))概率的每一行,您都可以num_samples
從分布中獲得樣本。每個樣本是0
和之間的整數(shù)num_classes - 1
,根據(jù)給定的概率繪制。因此,結(jié)果是具有[batch_size, num_samples]
每個分布的采樣整數(shù)形狀的 2D 張量。
編輯:函數(shù)的一個小例子。
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]]
在這種情況下,結(jié)果是一個有兩行 30 列的數(shù)組。第一行中的值是從分類分布中采樣的,其中每個類 ( [0, 1, 2, 3]) 具有相同的概率。在第二行中,該類3是最有可能的類,并且該類0沒有被抽樣的概率。

TA貢獻1719條經(jīng)驗 獲得超6個贊
希望這個簡單的例子會有所幫助。
tf.random.categorical
需要兩個參數(shù):
logits
, 形狀[batch_size, num_classes]
num_samples
前任:
list_indices.shape = (4, 10)
sampled_indices = tf.random.categorical(list_indices, num_samples=1)
sample_indices
將會
tf.Tensor(
[[2]
[9]
[4]
[7]], shape=(4, 1), dtype=int64)
這意味著1 num_samples取出10 num_classes每4行行 ( batch_size)
添加回答
舉報