深度实践OpenStack:基于Python的OpenStack组件开发—3.2.4 构造随机张量
3.2.4 构造随机张量
本节将介绍如何构造各元素是随机数的torch.Tensor类实例。机器生成的样本都是伪随机样本,样本的值由随机数种子(seed)和生成逻辑完全确定。但是由于种子往往不固定,并且生成逻辑经过精心设计,所以得到的样本体现出充分的随机性。
随机样本是根据概率分布生成的。概率分布可以分为离散概率分布和连续概率分布。由离散概率分布得到的样本一般是0、1这样的整数值,由连续概率分布得到的样本一般是浮点数。
首先来看离散随机张量的构造。这里介绍torch.bernoulli()、torch.multinomial()、torch. randperm()、torch.randint() 和torch.randint_like() 这5个函数。
* 函数torch.bernoulli() 可以生成元素值为0或1的张量。这个函数的参数是一个概率张量,概率张量的各元素都是0~1的值,表示结果张量对应位置为0的概率。例如:
probs = torch.full((3, 4), 0.6) # 概率张量
torch.bernoulli(probs) # 大小为(3, 4)的0~1张量
* 函数torch.multinomial() 可以生成元素值为的张量。这个函数可以接受两个参数,分别是表示结果张量中元素出现可能性的张量和表示对每个概率分布抽样次数的数值(一般设置为1)。值得一提的是,第0个参数中各元素出现可能性的和不需要为1。该函数会自行完成概率的归一化。例如:
weights = torch.tensor([[1,100],[100,1],[1,1]], dtype=torch.float32) # 权重
torch.multinomial(weights, 1)
* 函数torch.randperm() 可以随机生成一个排列。它的参数就是一个整数,得到的样本就是的一个排列,是大小为的张量。如果没有为这个函数指定关键字参数dtype,则默认的元素类型为torch.int64;如果指定了关键字参数dtype,则元素类型由dtype决定。例如,下面的代码构造了元素类型为torch.float32的张量:
torch.randperm(5, dtype=torch.float32)
* 函数torch.randint() 和函数torch.randint_like() 以独立同均匀分布生成离散均匀分布的张量。这两个函数都有关键字参数low和high,其中low表示均匀分布的最小值(含),high表示均匀分布的最大值(不含)。torch.randint() 函数还有一个关键字参数size,指定张量的大小,而torch.randint_like() 函数是通过第0个参数的大小推断张量大小的。在默认情况下,由该函数生成的张量的元素类型是torch.float32。
torch.randint(low=0, high=4, size=(3, 4))
torch.randint_like(torch.ones(3, 4), low=0, high=4)
接着介绍连续随机样本的生成。这里介绍torch.rand()、torch.rand_like()、torch.randn()、torch.randn_like() 和torch.normal() 这5个函数。
* 函数torch.rand() 和函数torch.rand_like() 生成标准均匀分布的随机变量。标准均匀分布在上的概率都相同。函数torch.rand() 的参数和函数torch.ones() 的参数类似,传入生成张量的大小;函数torch.rand_like() 的参数和函数torch.ones_like() 的参数类似,构造出和传入张量相同大小的随机张量。例如:
torch.rand(2, 3)
torch.rand_like(torch.ones(2, 3))
* 函数torch.randn() 和函数torch.randn_like() 生成标准正态分布的随机变量。标准正态分布均值为0,方差为1。函数torch.randn() 的参数和函数torch.ones() 的参数类似,传入生成张量的大小;函数torch.randn_like() 的参数和函数torch.ones_like() 的参数类似,构造出和传入张量相同大小的随机张量。例如:
torch.randn(2, 3)
torch.randn_like(torch.ones(2, 3))
* 函数torch.normal()也是生成正态分布的随机变量。不同之处在于,它可以指定正态分布的均值和方差。例如:
mean = torch.tensor([0., 1.])
std = torch.tensor([3., 2.])
print(torch.normal(mean, std))
至此,我们已经了解了许许多多构造torch.Tensor类实例的方法。后续我们将使用构造好的torch.Tensor类实例。
- 点赞
- 收藏
- 关注作者
评论(0)