如何在 PyTorch 中获得 [r1,r2] 范围内的均匀分布?
How to get a uniform distribution in a range [r1,r2] in PyTorch?
我想要一个二维 torch.Tensor
,大小 [a,b]
填充了 PyTorch 中均匀分布(范围 [r1,r2]
)的值。
如果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
分解如下:
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]])
(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]])
(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
- 同样,
torch.rand(a, 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]])
(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]])
(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)的数字.
torch.FloatTensor(a, b).uniform_(r1, r2)
要获得均匀的随机分布,您可以使用
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] 的张量输出。
请你试试这样的东西:
import torch as pt
pt.empty(2,3).uniform_(5,10).type(pt.FloatTensor)
此答案使用 NumPy 首先生成随机矩阵,然后将矩阵转换为 PyTorch 张量。我发现 NumPy API 更容易理解。
import numpy as np
torch.from_numpy(np.random.uniform(low=r1, high=r2, size=(a, b)))
查看所有发行版: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)
但我不得不承认我不知道生成采样器的意义是什么,为什么不直接调用它,就像我在 one liner(最后一行代码)中所做的那样。
评论:
- 采样器非常适合它,因此您可以 transform/compose/cache/etc 分布。见 https://arxiv.org/abs/1711.10604, and the top of the docs of https://pytorch.org/docs/stable/distributions.html# and https://arxiv.org/abs/1506.05254
- 您可以将张量输入 uniform 以让它知道高维区间(超立方体)以生成均匀样本(这就是为什么它接收张量作为输入而不是简单的数字)
参考:
利用 torch.distributions
包生成来自不同分布的样本。
例如,要从 range(low, high)
的均匀分布中采样大小为 [a,b]
的二维 PyTorch 张量,请尝试以下示例代码
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])
PyTorch 内置了许多分布。您可以使用从均匀分布中提取的元素构建所需 shape
的张量,如下所示:
from torch.distributions.uniform import Uniform
shape = 3,4
r1, r2 = 0,1
x = Uniform(r1, r2).sample(shape)
我想要一个二维 torch.Tensor
,大小 [a,b]
填充了 PyTorch 中均匀分布(范围 [r1,r2]
)的值。
如果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
分解如下:
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]])
(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]])
(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
- 同样,
torch.rand(a, 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]])
(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]])
(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)的数字.
torch.FloatTensor(a, b).uniform_(r1, r2)
要获得均匀的随机分布,您可以使用
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] 的张量输出。
请你试试这样的东西:
import torch as pt
pt.empty(2,3).uniform_(5,10).type(pt.FloatTensor)
此答案使用 NumPy 首先生成随机矩阵,然后将矩阵转换为 PyTorch 张量。我发现 NumPy API 更容易理解。
import numpy as np
torch.from_numpy(np.random.uniform(low=r1, high=r2, size=(a, b)))
查看所有发行版: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)
但我不得不承认我不知道生成采样器的意义是什么,为什么不直接调用它,就像我在 one liner(最后一行代码)中所做的那样。
评论:
- 采样器非常适合它,因此您可以 transform/compose/cache/etc 分布。见 https://arxiv.org/abs/1711.10604, and the top of the docs of https://pytorch.org/docs/stable/distributions.html# and https://arxiv.org/abs/1506.05254
- 您可以将张量输入 uniform 以让它知道高维区间(超立方体)以生成均匀样本(这就是为什么它接收张量作为输入而不是简单的数字)
参考:
利用 torch.distributions
包生成来自不同分布的样本。
例如,要从 range(low, high)
的均匀分布中采样大小为 [a,b]
的二维 PyTorch 张量,请尝试以下示例代码
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])
PyTorch 内置了许多分布。您可以使用从均匀分布中提取的元素构建所需 shape
的张量,如下所示:
from torch.distributions.uniform import Uniform
shape = 3,4
r1, r2 = 0,1
x = Uniform(r1, r2).sample(shape)