torch.multinomial
torch.multinomial(input, num_samples,replacement=False, out=None) → LongTensor
返回一个张量,每行包含从input相应行中定义的多项分布中抽取的num_samples个样本。
[注意]: 输入input每行的值不需要总和为1 (这里我们用来做权重),但是必须非负且总和不能为0。当抽取样本时,依次从左到右排列(第一个样本对应第一列)。如果输入input是一个向量,输出out也是一个相同长度num_samples的向量。如果输入input是有 m行的矩阵,输出out是形如m×n的矩阵。如果参数replacement 为 True, 则样本抽取可以重复。否则,一个样本在每行不能被重复抽取。参数num_samples必须小于input长度(即,input的列数,如果是input是一个矩阵)。
参数:
- input (Tensor) – 包含概率值的张量
- num_samples (int) – 抽取的样本数
- replacement (bool, optional) – 布尔值,决定是否能重复抽取
- out (Tensor, optional) – 结果张量
>>> weights = torch.Tensor([0, 10, 3, 0]) # create a Tensor of weights
>>> torch.multinomial(weights, 4)
1
2
0
0
[torch.LongTensor of size 4]
>>> torch.multinomial(weights, 4, replacement=True)
1
2
1
2
[torch.LongTensor of size 4]
输入是[0,10,3,0],也就是说第0个元素和第3个元素权重都是0,在其他元素被取完之前是不会被取到的。
所以第一个multinomial取4次,可以试试重复运行这条命令,发现只会有2种结果:[1 2 0 0]以及[2 1 0 0],以[1 2 0 0]这种情况居多。这其实很好理解,第1个元素权重比第2个元素权重要大,所以先取第1个元素的概率就会大。在第1和2个元素取完之后,剩下了2个没有权重的元素,它们才会被取到。但实际上权重为0的元素被取到时也不会显示正确的下标,关于0的下标问题我还没有想到很合理的解释,先行略过。
而第二个multinomial取4次,发现就只会出现1和2这两个元素了。这是因为replacement为真,所以有放回,就永远也不会取到权重为0的元素了。
再试试输入二维张量,则返回的也会成为一个二维张量,行数为输入的行数,列数为n_samples,即每一行都取了n_samples次,取法和一维张量相同。