How to get a uniform distribution in a range [r1,r2] in PyTorch?

Viewed 67774

I want to get a 2-D torch.Tensor with size [a,b] filled with values from a uniform distribution (in range [r1,r2]) in PyTorch.

9 Answers

Utilize the torch.distributions package to generate samples from different distributions.

For example to sample a 2d PyTorch tensor of size [a,b] from a uniform distribution of range(low, high) try the following sample code

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]) 

To get a uniform random distribution, you can use

torch.distributions.uniform.Uniform()

example,

import torch
from torch.distributions import uniform

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

This will give the output, tensor of size [2, 3].

Please Can you try something like:

import torch as pt
pt.empty(2,3).uniform_(5,10).type(pt.FloatTensor)

This answer uses NumPy to first produce a random matrix and then converts the matrix to a PyTorch tensor. I find the NumPy API to be easier to understand.

import numpy as np

torch.from_numpy(np.random.uniform(low=r1, high=r2, size=(a, b)))

PyTorch has a number of distributions built in. You can build a tensor of the desired shape with elements drawn from a uniform distribution like so:

from torch.distributions.uniform import Uniform

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

x = Uniform(r1, r2).sample(shape) 

See this for all distributions: https://pytorch.org/docs/stable/distributions.html#torch.distributions.uniform.Uniform

This is the way I found works:

# 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)

but I have to admit I don't know what the point of generating sampler is and why not just call it directly as I do in the one liner (last line of code).

Comments:


Reference:

Related