43

我想在 PyTorch中获得一个torch.Tensor大小[a,b]填充了来自均匀分布(在 range 中)的值的二维。[r1,r2]

4

8 回答 8

64

如果U是均匀分布在 [0, 1] 上的随机变量,则(r1 - r2) * U + r2均匀分布在 [r1, r2] 上。

因此,您只需要:

(r1 - r2) * torch.rand(a, b) + r2

或者,您可以简单地使用:

torch.FloatTensor(a, b).uniform_(r1, r2)

为了充分解释这个公式,让我们看一些具体的数字:

r1 = 2 # Create uniform random numbers in half-open interval [2.0, 5.0)
r2 = 5

a = 1  # Create tensor shape 1 x 7
b = 7

我们可以将表达式分解(r1 - r2) * torch.rand(a, b) + r2如下:

  1. torch.rand(a, b)产生一个a x b(1x7) 张量,其数字均匀分布在 [0.0, 1.0) 范围内.
x = torch.rand(a, b)
print(x)
# tensor([[0.5671, 0.9814, 0.8324, 0.0241, 0.2072, 0.6192, 0.4704]])
  1. (r1 - r2) * torch.rand(a, b)产生分布在均匀范围 [0.0, -3.0) 内的数字
print((r1 - r2) * x)
tensor([[-1.7014, -2.9441, -2.4972, -0.0722, -0.6216, -1.8577, -1.4112]])
  1. (r1 - r2) * torch.rand(a, b) + r2产生统一范围内的数字 [5.0, 2.0)
print((r1 - r2) * x + r2)
tensor([[3.2986, 2.0559, 2.5028, 4.9278, 4.3784, 3.1423, 3.5888]])

现在,让我们分解@Jonasson 建议的答案:(r2 - r1) * torch.rand(a, b) + r1

  1. 同样,torch.rand(a, b)产生在 [0.0, 1.0) 范围内均匀分布的 (1x7) 数字。
x = torch.rand(a, b)
print(x)
# tensor([[0.5671, 0.9814, 0.8324, 0.0241, 0.2072, 0.6192, 0.4704]])
  1. (r2 - r1) * torch.rand(a, b)产生在 [0.0, 3.0) 范围内均匀分布的数字。
print((r2 - r1) * x)
# tensor([[1.7014, 2.9441, 2.4972, 0.0722, 0.6216, 1.8577, 1.4112]])
  1. (r2 - r1) * torch.rand(a, b) + r1产生在 [2.0, 5.0) 范围内均匀分布的数字
print((r2 - r1) * x + r1)
tensor([[3.7014, 4.9441, 4.4972, 2.0722, 2.6216, 3.8577, 3.4112]])

总之(r1 - r2) * torch.rand(a, b) + r2生成范围 [r2, r1)(r2 - r1) * torch.rand(a, b) + r1中的数字,而生成范围 [r1, r2) 中的数字。

于 2017-06-05T18:56:11.983 回答
23
torch.FloatTensor(a, b).uniform_(r1, r2)
于 2017-12-01T23:08:41.020 回答
7

利用torch.distributions包从不同的分布中生成样本。

例如,[a,b]要从均匀分布中采样一个大小为 2d PyTorch 张量,请range(low, high)尝试以下示例代码

import torch
a,b = 2,3   #dimension of the pytorch tensor to be generated
low,high = 0,1 #range of uniform distribution

x = torch.distributions.uniform.Uniform(low,high).sample([a,b]) 
于 2020-11-18T23:08:19.907 回答
2

要获得均匀的随机分布,您可以使用

torch.distributions.uniform.Uniform()

例子,

import torch
from torch.distributions import uniform

distribution = uniform.Uniform(torch.Tensor([0.0]),torch.Tensor([5.0]))
distribution.sample(torch.Size([2,3])

这将给出输出,大小为 [2, 3] 的张量。

于 2018-10-19T18:42:28.447 回答
2

请你可以尝试类似的东西:

import torch as pt
pt.empty(2,3).uniform_(5,10).type(pt.FloatTensor)
于 2019-05-28T09:49:59.343 回答
1

这个答案使用 NumPy 首先生成一个随机矩阵,然后将矩阵转换为 PyTorch 张量。我发现 NumPy API 更容易理解。

import numpy as np

torch.from_numpy(np.random.uniform(low=r1, high=r2, size=(a, b)))
于 2020-01-05T22:23:46.380 回答
1

PyTorch 内置了许多分布。您可以shape使用从均匀分布中提取的元素构建所需的张量,如下所示:

from torch.distributions.uniform import Uniform

shape = 3,4
r1, r2 = 0,1

x = Uniform(r1, r2).sample(shape) 
于 2021-03-12T12:41:37.953 回答
0

查看所有发行版:https ://pytorch.org/docs/stable/distributions.html#torch.distributions.uniform.Uniform

这是我发现工作的方式:

# generating uniform variables

import numpy as np

num_samples = 3
Din = 1
lb, ub = -1, 1

xn = np.random.uniform(low=lb, high=ub, size=(num_samples,Din))
print(xn)

import torch

sampler = torch.distributions.Uniform(low=lb, high=ub)
r = sampler.sample((num_samples,Din))

print(r)

r2 = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples,Din))

print(r2)

# process input
f = nn.Sequential(OrderedDict([
    ('f1', nn.Linear(Din,Dout)),
    ('out', nn.SELU())
]))
Y = f(r2)
print(Y)

但我不得不承认我不知道生成采样器的意义何在,为什么不直接调用它,就像我在一个衬里(最后一行代码)中所做的那样。

注释:


参考:

于 2020-07-15T16:44:08.083 回答