PyTorch学习笔记(三)

随机抽样 Random sampling

torch.manual_seed

1
torch.manual_seed(seed)

设定生成随机数的种子,并返回一个 torch._C.Generator 对象

参数:

  • seed (int or long) – 种子

torch.initial_seed

1
torch.initial_seed()

返回生成随机数的原始种子值(python long)

torch.get_rng_state

1
torch.get_rng_state

返回随机生成器状态(ByteTensor)

torch.set_rng_state

1
torch.set_rng_state(new_state)

设定随机生成器状态

参数:

  • new_state (torch.ByteTensor) – 期望的状态

torch.torch.bernoulli

伯努利分布中抽取二元随机数(0 或者 1)。

输入张量须包含用于抽取上述二元随机值的概率。 因此,输入中的所有值都必须在[0,1]区间,即 $0<=input_i<=1$

输出张量的第i个元素值, 将会以输入张量的第i个概率值等于1。

返回值将会是与输入相同大小的张量,每个值为0或者1。

参数:

  • input (Tensor) – 输入为伯努利分布的概率值
  • out (Tensor, optional) – 输出张量(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> a = torch.Tensor(3, 3).uniform_(0, 1) # generate a uniform random matrix with range [0, 1]
>>> a

0.7544 0.8140 0.9842
0.5282 0.0595 0.6445
0.1925 0.9553 0.9732
[torch.FloatTensor of size 3x3]

>>> torch.bernoulli(a)

1 1 1
0 0 1
0 1 1
[torch.FloatTensor of size 3x3]

>>> a = torch.ones(3, 3) # probability of drawing "1" is 1
>>> torch.bernoulli(a)

1 1 1
1 1 1
1 1 1
[torch.FloatTensor of size 3x3]

>>> a = torch.zeros(3, 3) # probability of drawing "1" is 0
>>> torch.bernoulli(a)

0 0 0
0 0 0
0 0 0
[torch.FloatTensor of size 3x3]

torch.multinomial

1
torch.multinomial(input, num_samples,replacement=False, out=None) → LongTensor

返回一个张量,每行包含从input相应中定义的多项分布中抽取的num_samples个样本。

作用是对input的每一行做n_samples次取值,输出的张量是每一次取值时input张量对应行的下标。

注意:输入input每行的值不需要总和为1 (这里我们用来做权重),但是必须非负且总和不能为0

当抽取样本时,依次从左到右排列(第一个样本对应第一列)。

如果输入input是一个向量,输出out也是一个相同长度num_samples的向量。如果输入input是有m行的矩阵,输出out是形如m×num_samples的矩阵。

如果参数replacementTrue, 则样本抽取可以重复。否则,一个样本在每行不能被重复抽取。

参数num_samples必须小于input长度(即,input的列数,如果是input是一个矩阵)。

参数:

  • input (Tensor) – 包含概率值的张量
  • num_samples (int) – 抽取的样本数
  • replacement (bool, optional) – 布尔值,决定是否能重复抽取
  • out (Tensor, optional) – 结果张量

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> weights = torch.Tensor([0, 10, 3, 0]) # create a Tensor of weights
>>> torch.multinomial(weights, 4, replacement=True)

1
2
1
2
[torch.LongTensor of size 4]

>>> weights = torch.rand(3, 4)
tensor([[0.9005, 0.8463, 0.6070, 0.4762],
[0.6458, 0.0261, 0.7618, 0.7244],
[0.5225, 0.9317, 0.8163, 0.2554]])
>>> torch.multinomial(weights, 2)
tensor([[0, 1],
[2, 3],
[3, 0]])

输入是[0,10,3,0],也就是说第0个元素和第3个元素权重都是0,在其他元素被取完之前是不会被取到的。

torch.normal()

1
torch.normal(means, std, out=None)

返回一个张量,包含从给定参数means,std的离散正态分布中抽取随机数。 均值means是一个张量,包含每个输出元素相关的正态分布的均值。 std是一个张量,包含每个输出元素相关的正态分布的标准差。 均值和标准差的形状不须匹配,但每个张量的元素个数须相同

参数:

  • means (Tensor) – 均值
  • std (Tensor) – 标准差
  • out (Tensor) – 可选的输出张量
1
2
3
4
5
6
7
8
9
10
11
12
13
torch.normal(means=torch.arange(1, 11), std=torch.arange(1, 0, -0.1))

1.5104
1.6955
2.4895
4.9185
4.9895
6.9155
7.3683
8.1836
8.7164
9.8916
[torch.FloatTensor of size 10]