2503 lines
95 KiB
Python
2503 lines
95 KiB
Python
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
|
||
#
|
||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
# you may not use this file except in compliance with the License.
|
||
# You may obtain a copy of the License at
|
||
#
|
||
# http://www.apache.org/licenses/LICENSE-2.0
|
||
#
|
||
# Unless required by applicable law or agreed to in writing, software
|
||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
# See the License for the specific language governing permissions and
|
||
# limitations under the License.
|
||
|
||
# TODO: define random functions
|
||
|
||
from __future__ import annotations
|
||
|
||
from typing import TYPE_CHECKING, overload
|
||
|
||
import paddle
|
||
from paddle import _C_ops
|
||
from paddle._C_ops import poisson # noqa: F401
|
||
from paddle.base.framework import _current_expected_place, _to_pinned_place
|
||
from paddle.base.libpaddle import DataType
|
||
from paddle.common_ops_import import Variable
|
||
from paddle.framework import (
|
||
in_dynamic_mode,
|
||
in_dynamic_or_pir_mode,
|
||
in_pir_mode,
|
||
use_pir_api,
|
||
)
|
||
from paddle.utils.decorator_utils import (
|
||
param_one_alias,
|
||
param_two_alias,
|
||
size_args_decorator,
|
||
)
|
||
|
||
from ..base.data_feeder import (
|
||
check_dtype,
|
||
check_shape,
|
||
check_type,
|
||
check_variable_and_dtype,
|
||
)
|
||
from ..framework import (
|
||
LayerHelper,
|
||
_get_paddle_place,
|
||
convert_nptype_to_datatype_or_vartype,
|
||
core,
|
||
dygraph_only,
|
||
)
|
||
|
||
if TYPE_CHECKING:
|
||
from paddle import Tensor
|
||
from paddle._typing import DTypeLike, PlaceLike, ShapeLike
|
||
|
||
__all__ = []
|
||
|
||
|
||
@param_one_alias(['x', 'input'])
|
||
def bernoulli(
|
||
x: Tensor,
|
||
p: float | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
) -> Tensor:
|
||
r"""
|
||
|
||
For each element :math:`x_i` in input ``x``, take a sample from the Bernoulli distribution, also called two-point distribution,
|
||
with success probability :math:`x_i`. The Bernoulli distribution with success probability :math:`x_i` is a discrete probability
|
||
distribution with probability mass function
|
||
|
||
.. math::
|
||
p(y)=\begin{cases}
|
||
x_i,&y=1\\
|
||
1-x_i,&y=0
|
||
\end{cases}.
|
||
|
||
Args:
|
||
x (Tensor): The input Tensor, it's data type should be float32, float64.
|
||
Alias: ``input``.
|
||
p (float|None, optional): If ``p`` is given, the success probability will always be ``p``. Default is None, which means
|
||
to use the success probability specified by input ``x``.
|
||
name (str|None, optional): For details, please refer to :ref:`api_guide_Name`. Generally, no setting is required. Default: None.
|
||
|
||
Keyword args:
|
||
out(Tensor, optional): The output tensor.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled samples from Bernoulli distribution, whose shape and dtype are same as ``x``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> paddle.set_device('cpu') # on CPU device
|
||
>>> paddle.seed(100)
|
||
|
||
>>> x = paddle.rand([2,3])
|
||
>>> print(x)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.55355281, 0.20714243, 0.01162981],
|
||
[0.51577556, 0.36369765, 0.26091650]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> out = paddle.bernoulli(x)
|
||
>>> print(out)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[1., 0., 1.],
|
||
[0., 1., 0.]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> out = paddle.bernoulli(x, p=0)
|
||
>>> print(out)
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0., 0., 0.],
|
||
[0., 0., 0.]])
|
||
"""
|
||
|
||
if p is not None:
|
||
x = paddle.full_like(x, p)
|
||
|
||
if in_dynamic_or_pir_mode():
|
||
return _C_ops.bernoulli(x, out=out)
|
||
else:
|
||
check_variable_and_dtype(
|
||
x, "x", ["float32", "float64", "float16", "uint16"], "bernoulli"
|
||
)
|
||
|
||
helper = LayerHelper("randint", **locals())
|
||
out = helper.create_variable_for_type_inference(
|
||
dtype=x.dtype
|
||
) # maybe set out to int32 ?
|
||
helper.append_op(
|
||
type='bernoulli', inputs={"X": x}, outputs={'Out': out}, attrs={}
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
@dygraph_only
|
||
def bernoulli_(
|
||
x: Tensor, p: float | Tensor = 0.5, name: str | None = None
|
||
) -> Tensor:
|
||
"""
|
||
This is the inplace version of api ``bernoulli``, which returns a Tensor filled
|
||
with random values sampled from a bernoulli distribution. The output Tensor will
|
||
be inplaced with input ``x``. Please refer to :ref:`api_paddle_bernoulli`.
|
||
|
||
Args:
|
||
x(Tensor): The input tensor to be filled with random values.
|
||
p (float|Tensor, optional): The success probability parameter of the output Tensor's bernoulli distribution.
|
||
If ``p`` is float, all elements of the output Tensor shared the same success probability.
|
||
If ``p`` is a Tensor, it has per-element success probabilities, and the shape should be broadcastable to ``x``.
|
||
Default is 0.5
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from the bernoulli distribution with success probability ``p`` .
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.set_device('cpu')
|
||
>>> paddle.seed(200)
|
||
>>> x = paddle.randn([3, 4])
|
||
>>> x.bernoulli_()
|
||
>>> print(x)
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[1., 0., 1., 0.],
|
||
[0., 0., 1., 0.],
|
||
[1., 0., 1., 1.]])
|
||
|
||
>>> x = paddle.randn([3, 4])
|
||
>>> p = paddle.randn([3, 1])
|
||
>>> x.bernoulli_(p)
|
||
>>> print(x)
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0., 0., 0., 0.],
|
||
[1., 1., 1., 1.],
|
||
[1., 1., 1., 1.]])
|
||
"""
|
||
x.uniform_(0.0, 1.0)
|
||
ones_mask = x < p
|
||
zeros_mask = x > p
|
||
x.masked_fill_(ones_mask, 1.0)
|
||
x.masked_fill_(zeros_mask, 0.0)
|
||
return x
|
||
|
||
|
||
def binomial(count: Tensor, prob: Tensor, name: str | None = None) -> Tensor:
|
||
r"""
|
||
Returns a tensor filled with random number from the Binomial Distribution, which supports Tensor shape
|
||
broadcasting. The returned Tensor's data type is int64.
|
||
|
||
.. math::
|
||
|
||
out_i \sim Binomial (n = count_i, p = prob_i)
|
||
|
||
Args:
|
||
count(Tensor): A tensor with each element specifying the size of a binomial distribution. The input
|
||
data type should be int32 or int64.
|
||
prob(Tensor): A tensor with each element specifying the probability of success in the binomial experiment.
|
||
The input data type should be bfloat16, float16, float32, float64.
|
||
name(str|None, optional): The default value is None. Normally there is no need for user to set this
|
||
property. For more information, please refer to :ref:`api_guide_Name`.
|
||
Returns:
|
||
Tensor, A Tensor filled with binomial random values with the same shape as the broadcasted Tensors of
|
||
``count`` and ``prob``. The data type is int64.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.set_device('cpu')
|
||
>>> paddle.seed(100)
|
||
|
||
>>> n = paddle.to_tensor([10.0, 50.0])
|
||
>>> p = paddle.to_tensor([0.2, 0.6])
|
||
>>> out = paddle.binomial(n, p)
|
||
>>> print(out)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[1 , 31])
|
||
>>> # doctest: -SKIP
|
||
"""
|
||
if in_dynamic_or_pir_mode():
|
||
count, prob = paddle.broadcast_tensors(
|
||
[paddle.cast(count, dtype=prob.dtype), prob]
|
||
)
|
||
return _C_ops.binomial(count, prob)
|
||
else:
|
||
check_variable_and_dtype(count, "count", ["int32", "int64"], "binomial")
|
||
check_variable_and_dtype(
|
||
prob,
|
||
"prob",
|
||
["bfloat16", "float16", "float32", "float64"],
|
||
"binomial",
|
||
)
|
||
|
||
count, prob = paddle.broadcast_tensors(
|
||
[paddle.cast(count, dtype=prob.dtype), prob]
|
||
)
|
||
helper = LayerHelper("binomial", **locals())
|
||
out = helper.create_variable_for_type_inference(
|
||
dtype=convert_nptype_to_datatype_or_vartype('int64')
|
||
)
|
||
helper.append_op(
|
||
type='binomial',
|
||
inputs={"count": count, "prob": prob},
|
||
outputs={'out': out},
|
||
attrs={},
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
def standard_gamma(x: Tensor, name: str | None = None) -> Tensor:
|
||
r"""
|
||
Returns a tensor filled with random number from a Standard Gamma Distribution.
|
||
|
||
.. math::
|
||
|
||
out_i \sim Gamma (alpha = x_i, beta = 1.0)
|
||
|
||
Args:
|
||
x(Tensor): A tensor with rate parameter of standard gamma Distribution. The data type
|
||
should be bfloat16, float16, float32, float64.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
Returns:
|
||
Tensor, A Tensor filled with random number with the same shape and dtype as ``x``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.set_device('cpu')
|
||
>>> paddle.seed(100)
|
||
|
||
>>> x = paddle.uniform([2, 3], min=1.0, max=5.0)
|
||
>>> out = paddle.standard_gamma(x)
|
||
>>> print(out)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[3.35393834, 0.80538225, 0.36511323],
|
||
[6.10344696, 4.28612375, 6.37196636]])
|
||
>>> # doctest: -SKIP
|
||
"""
|
||
if in_dynamic_or_pir_mode():
|
||
return _C_ops.standard_gamma(x)
|
||
else:
|
||
check_variable_and_dtype(
|
||
x, "x", ["float32", "float64"], "standard_gamma"
|
||
)
|
||
|
||
helper = LayerHelper("standard_gamma", **locals())
|
||
out = helper.create_variable_for_type_inference(dtype=x.dtype)
|
||
helper.append_op(
|
||
type='standard_gamma',
|
||
inputs={'x': x},
|
||
outputs={'out': out},
|
||
attrs={},
|
||
)
|
||
return out
|
||
|
||
|
||
def log_normal(
|
||
mean: float | Tensor = 1.0,
|
||
std: float | Tensor = 2.0,
|
||
shape: ShapeLike | None = None,
|
||
name: str | None = None,
|
||
) -> Tensor:
|
||
r"""
|
||
Returns a Tensor filled with random values sampled from a Log Normal
|
||
Distribution, with ``mean``, ``std``.
|
||
The Log Normal Distribution is defined as follows
|
||
|
||
.. math::
|
||
|
||
f(x) = \frac{1}{x\sigma\sqrt{2\pi}}e^{-\frac{(\ln{x}-\mu)^2}{2\sigma^2}}
|
||
|
||
Args:
|
||
mean (float|Tensor, optional): The mean of the output Tensor's underlying normal distribution.
|
||
If ``mean`` is float, all elements of the output Tensor share the same mean.
|
||
If ``mean`` is a Tensor(data type supports float32, float64), it has per-element means.
|
||
Default is 1.0
|
||
std (float|Tensor, optional): The standard deviation of the output Tensor's underlying normal distribution.
|
||
If ``std`` is float, all elements of the output Tensor share the same standard deviation.
|
||
If ``std`` is a Tensor(data type supports float32, float64), it has per-element standard deviations.
|
||
Default is 2.0
|
||
shape (tuple|list|Tensor|None, optional): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list. If ``mean`` or ``std``
|
||
is a Tensor, the shape of the output Tensor is the same as ``mean`` or ``std`` , attr ``shape`` is ignored.
|
||
Default is None
|
||
name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a log normal distribution with the underlying normal distribution's ``mean`` and ``std`` .
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.seed(200)
|
||
|
||
>>> out1 = paddle.log_normal(shape=[2, 3])
|
||
>>> print(out1)
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[4.01107359 , 3.53824377 , 25.79078865],
|
||
[0.83332109 , 0.40513405 , 2.09763741 ]])
|
||
|
||
>>> mean_tensor = paddle.to_tensor([1.0, 2.0, 3.0])
|
||
>>> out2 = paddle.log_normal(mean=mean_tensor)
|
||
>>> print(out2)
|
||
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[4.45330524 , 0.57903880 , 31.82369995])
|
||
|
||
>>> std_tensor = paddle.to_tensor([1.0, 2.0, 3.0])
|
||
>>> out3 = paddle.log_normal(mean=mean_tensor, std=std_tensor)
|
||
>>> print(out3)
|
||
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[10.31321430, 8.97369766 , 35.76752090])
|
||
"""
|
||
normal_sample = paddle.normal(mean=mean, std=std, shape=shape, name=name)
|
||
return paddle.exp(normal_sample)
|
||
|
||
|
||
@dygraph_only
|
||
def log_normal_(
|
||
x: Tensor, mean: float = 1.0, std: float = 2.0, name: str | None = None
|
||
) -> Tensor:
|
||
r"""
|
||
This inplace version of api ``log_normal``, which returns a Tensor filled
|
||
with random values sampled from a log normal distribution. The output Tensor will
|
||
be inplaced with input ``x``. Please refer to :ref:`api_paddle_log_normal`.
|
||
|
||
Args:
|
||
x (Tensor): The input tensor to be filled with random values.
|
||
mean (float|int, optional): Mean of the output tensor, default is 1.0.
|
||
std (float|int, optional): Standard deviation of the output tensor, default
|
||
is 2.0.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a log normal distribution with the underlying normal distribution's ``mean`` and ``std`` .
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.seed(200)
|
||
>>> x = paddle.randn([3, 4])
|
||
>>> x.log_normal_()
|
||
>>> print(x)
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[3.99360156 , 0.11746082 , 12.14813519, 4.74383831 ],
|
||
[0.36592522 , 0.09426476 , 31.81549835, 0.61839998 ],
|
||
[1.33314908 , 12.31954002, 36.44527435, 1.69572163 ]])
|
||
"""
|
||
return normal_(x, mean=mean, std=std).exp_()
|
||
|
||
|
||
@param_one_alias(["x", "input"])
|
||
def multinomial(
|
||
x: Tensor,
|
||
num_samples: int = 1,
|
||
replacement: bool = False,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a Multinomial
|
||
distribution. The input ``x`` is a tensor with probabilities for generating the
|
||
random number. Each element in ``x`` should be larger or equal to 0, but not all
|
||
0. ``replacement`` indicates whether it is a replaceable sample. If ``replacement``
|
||
is True, a category can be sampled more than once.
|
||
|
||
.. note::
|
||
Alias Support: The parameter name ``input`` can be used as an alias for ``x``.
|
||
For example, ``multinomial(input=tensor_x, ...)`` is equivalent to ``multinomial(x=tensor_x, ...)``.
|
||
|
||
Args:
|
||
x(Tensor): A tensor with probabilities for generating the random number. The data type
|
||
should be float32, float64.
|
||
alias: ``input``.
|
||
num_samples(int, optional): Number of samples, default is 1.
|
||
replacement(bool, optional): Whether it is a replaceable sample, default is False.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
out (Tensor|None, optional): The output Tensor. If set, the result will be stored in this Tensor. Default is None.
|
||
Returns:
|
||
Tensor, A Tensor filled with sampled category index after ``num_samples`` times samples.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.seed(100) # on CPU device
|
||
|
||
>>> x = paddle.rand([2, 4])
|
||
>>> print(x)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.55355281, 0.20714243, 0.01162981, 0.51577556],
|
||
[0.36369765, 0.26091650, 0.18905126, 0.56219709]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> paddle.seed(200) # on CPU device
|
||
>>> out1 = paddle.multinomial(x, num_samples=5, replacement=True)
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 5], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[3, 3, 0, 0, 0],
|
||
[3, 3, 3, 1, 0]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # out2 = paddle.multinomial(x, num_samples=5)
|
||
>>> # InvalidArgumentError: When replacement is False, number of samples
|
||
>>> # should be less than non-zero categories
|
||
|
||
>>> paddle.seed(300) # on CPU device
|
||
>>> out3 = paddle.multinomial(x, num_samples=3)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[3, 0, 1],
|
||
[3, 1, 0]])
|
||
>>> # doctest: -SKIP
|
||
|
||
"""
|
||
|
||
if in_dynamic_or_pir_mode():
|
||
return _C_ops.multinomial(x, num_samples, replacement, out=out)
|
||
else:
|
||
check_variable_and_dtype(
|
||
x, "x", ["uint16", "float16", "float32", "float64"], "multinomial"
|
||
)
|
||
|
||
helper = LayerHelper("multinomial", **locals())
|
||
out = helper.create_variable_for_type_inference(
|
||
dtype=convert_nptype_to_datatype_or_vartype('int64')
|
||
)
|
||
helper.append_op(
|
||
type='multinomial',
|
||
inputs={"X": x},
|
||
outputs={'Out': out},
|
||
attrs={'num_samples': num_samples, 'replacement': replacement},
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
def uniform_random_batch_size_like(
|
||
input: Tensor,
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike = 'float32',
|
||
input_dim_idx: int = 0,
|
||
output_dim_idx: int = 0,
|
||
min: float = -1.0,
|
||
max: float = 1.0,
|
||
seed: int = 0,
|
||
) -> Tensor:
|
||
"""
|
||
This OP initializes a variable with random values sampled from a
|
||
uniform distribution in the range [min, max). The input_dim_idx used to get the input dimension value which will be used to resize the output dimension.
|
||
.. code-block:: text
|
||
|
||
*Case 1:
|
||
Given:
|
||
input =[[0.946741 , 0.1357001 , 0.38086128]] # input.shape=[1,3]
|
||
shape=[2,4]
|
||
result.shape[output_dim_idx] = input.shape[input_dim_idx],
|
||
output_dim_idx = 0,
|
||
input_dim_idx = 0,
|
||
result.shape[0] = input.shape[0],
|
||
then:
|
||
result=[[ 0.3443427 , -0.23056602, 0.3477049 , 0.06139076]] # result.shape=[1,4]
|
||
*Case 2:
|
||
Given:
|
||
input =[[0.946741 , 0.1357001 , 0.38086128]] # input.shape=[1,3]
|
||
shape=[2,4]
|
||
input_dim_idx=1
|
||
output_dim_idx=1
|
||
result.shape[output_dim_idx] = input.shape[input_dim_idx],
|
||
output_dim_idx = 1,
|
||
input_dim_idx = 1,
|
||
result.shape[1] = input.shape[1],
|
||
then:
|
||
result=[[-0.23133647, -0.84195036, 0.21441269],
|
||
[-0.08774924, 0.25605237, -0.09403259]] # result.shape=[2,3]
|
||
|
||
Args:
|
||
input (Tensor): A Tensor. Supported data types: float32, float64.
|
||
shape (tuple|list): A python list or python tuple. The shape of the output Tensor, the data type is int.
|
||
dtype(str|paddle.dtype|np.dtype, optional): The data type of output Tensor. Supported data types: float32, float64. Default float32.
|
||
input_dim_idx (int, optional): An index used to get the input dimension value which will be used to resize the output dimension. Default 0.
|
||
output_dim_idx (int, optional): An index used to indicate the specific dimension that will be replaced by corresponding input dimension value. Default 0.
|
||
min (float, optional): The lower bound on the range of random values to generate, the min is included in the range. Default -1.0.
|
||
max (float, optional): The upper bound on the range of random values to generate, the max is excluded in the range. Default 1.0.
|
||
seed (int, optional): Random seed used for generating samples. 0 means use a seed generated by the system.Note that if seed is not 0, this operator will always generate the same random numbers every time.
|
||
|
||
Returns:
|
||
Tensor, A Tensor of the specified shape filled with uniform_random values. The shape of the Tensor is determined by the shape parameter and the specified dimension of the input Tensor.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> import paddle.base as base
|
||
>>> from paddle.tensor import random
|
||
>>> paddle.enable_static()
|
||
>>> # example 1:
|
||
>>> input = paddle.static.data(name="input", shape=[1, 3], dtype='float32')
|
||
>>> out_1 = random.uniform_random_batch_size_like(input, [2, 4])
|
||
>>> print(out_1.shape)
|
||
paddle.Size([1, 4])
|
||
|
||
>>> # example 2:
|
||
>>> out_2 = random.uniform_random_batch_size_like(input, [2, 4], input_dim_idx=1, output_dim_idx=1)
|
||
>>> print(out_2.shape)
|
||
paddle.Size([2, 3])
|
||
"""
|
||
if in_dynamic_or_pir_mode():
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
return _C_ops.uniform_random_batch_size_like(
|
||
input,
|
||
shape,
|
||
input_dim_idx,
|
||
output_dim_idx,
|
||
min,
|
||
max,
|
||
seed,
|
||
0,
|
||
0,
|
||
1.0,
|
||
dtype,
|
||
)
|
||
|
||
check_variable_and_dtype(
|
||
input,
|
||
'Input',
|
||
("float32", 'float64', "uint16"),
|
||
'uniform_random_batch_size_like',
|
||
)
|
||
check_type(shape, 'shape', (list, tuple), 'uniform_random_batch_size_like')
|
||
check_dtype(
|
||
dtype,
|
||
'dtype',
|
||
('float32', 'float64', "uint16"),
|
||
'uniform_random_batch_size_like',
|
||
)
|
||
|
||
helper = LayerHelper('uniform_random_batch_size_like', **locals())
|
||
out = helper.create_variable_for_type_inference(dtype)
|
||
c_dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
helper.append_op(
|
||
type='uniform_random_batch_size_like',
|
||
inputs={'Input': input},
|
||
outputs={'Out': out},
|
||
attrs={
|
||
'shape': shape,
|
||
'input_dim_idx': input_dim_idx,
|
||
'output_dim_idx': output_dim_idx,
|
||
'min': min,
|
||
'max': max,
|
||
'seed': seed,
|
||
'dtype': c_dtype,
|
||
},
|
||
)
|
||
|
||
return out
|
||
|
||
|
||
def gaussian(
|
||
shape: ShapeLike,
|
||
mean: complex = 0.0,
|
||
std: float = 1.0,
|
||
seed: int = 0,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a Gaussian
|
||
distribution, with ``shape`` and ``dtype``.
|
||
|
||
Args:
|
||
shape (tuple|list|Tensor): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list.
|
||
mean (float|int|complex, optional): Mean of the output tensor, default is 0.0.
|
||
std (float|int, optional): Standard deviation of the output tensor, default
|
||
is 1.0.
|
||
seed (int, optional): Random seed of generator.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the output Tensor.
|
||
Supported data types: bfloat16, float16, float32, float64, complex64, complex128.
|
||
Default is None, use global default dtype (see ``get_default_dtype``
|
||
for details).
|
||
name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
|
||
out(Tensor, optional): The output tensor.
|
||
device(PlaceLike|None, optional): The desired device of returned tensor.
|
||
if None, uses the current device for the default tensor type (see paddle.device.set_device()).
|
||
device will be the CPU for CPU tensor types and the current CUDA device for CUDA tensor types. Default: None.
|
||
requires_grad(bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a Gaussian
|
||
distribution, with ``shape`` and ``dtype``.
|
||
"""
|
||
op_type_for_check = 'gaussian/standard_normal/randn/normal'
|
||
supported_dtypes = [
|
||
'float32',
|
||
'float64',
|
||
'float16',
|
||
'uint16',
|
||
'bfloat16',
|
||
'complex64',
|
||
'complex128',
|
||
]
|
||
|
||
if dtype is None:
|
||
dtype = paddle.framework.get_default_dtype()
|
||
if dtype not in supported_dtypes:
|
||
raise TypeError(
|
||
f"{op_type_for_check} only supports {supported_dtypes}, but the default dtype is {dtype}"
|
||
)
|
||
if not isinstance(dtype, (core.VarDesc.VarType, core.DataType)):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
|
||
if isinstance(mean, complex):
|
||
if dtype not in [
|
||
core.VarDesc.VarType.COMPLEX64,
|
||
core.VarDesc.VarType.COMPLEX128,
|
||
core.DataType.COMPLEX64,
|
||
core.DataType.COMPLEX128,
|
||
]:
|
||
raise TypeError(
|
||
"if mean is a complex number, dtype should be complex64 or complex128, "
|
||
f"but got dtype = {dtype}",
|
||
)
|
||
if mean.real != mean.imag:
|
||
raise ValueError(
|
||
"The mean of complex gaussian distribution should be a complex number with "
|
||
f"real part equal imaginary part, but got {mean.real} != {mean.imag}",
|
||
)
|
||
mean = mean.real
|
||
|
||
if in_dynamic_or_pir_mode():
|
||
if in_dynamic_mode():
|
||
shape = paddle.utils.convert_shape_to_list(shape)
|
||
elif in_pir_mode() and paddle.utils._contain_var(shape):
|
||
shape = paddle.utils.get_int_tensor_list(shape)
|
||
|
||
place = (
|
||
_current_expected_place()
|
||
if device is None
|
||
else _get_paddle_place(device)
|
||
)
|
||
tensor = _C_ops.gaussian(
|
||
shape, float(mean), float(std), seed, dtype, place, out=out
|
||
)
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
return tensor
|
||
else:
|
||
check_shape(shape, op_type_for_check)
|
||
check_dtype(dtype, 'dtype', supported_dtypes, op_type_for_check)
|
||
|
||
inputs = {}
|
||
attrs = {
|
||
'mean': mean,
|
||
'std': std,
|
||
'seed': seed,
|
||
'dtype': dtype,
|
||
}
|
||
paddle.utils.get_shape_tensor_inputs(
|
||
inputs=inputs, attrs=attrs, shape=shape, op_type=op_type_for_check
|
||
)
|
||
|
||
helper = LayerHelper('gaussian', **locals())
|
||
out = helper.create_variable_for_type_inference(dtype)
|
||
helper.append_op(
|
||
type='gaussian_random',
|
||
inputs=inputs,
|
||
outputs={'Out': out},
|
||
attrs=attrs,
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
@dygraph_only
|
||
def gaussian_(
|
||
x: Tensor,
|
||
mean: complex = 0.0,
|
||
std: float = 1.0,
|
||
seed: int = 0,
|
||
name: str | None = None,
|
||
) -> Tensor:
|
||
"""
|
||
This is the inplace version of OP ``gaussian``, which returns a Tensor filled
|
||
with random values sampled from a gaussian distribution. The output Tensor will
|
||
be inplaced with input ``x``. Please refer to :ref:`api_tensor_gaussian`.
|
||
|
||
Args:
|
||
x(Tensor): The input tensor to be filled with random values.
|
||
mean (float|int|complex, optional): Mean of the output tensor, default is 0.0.
|
||
std (float|int, optional): Standard deviation of the output tensor, default
|
||
is 1.0.
|
||
seed (int, optional): Random seed of generator.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
Returns:
|
||
Tensor, The input tensor x filled with random values sampled from a gaussian
|
||
distribution.
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> x = paddle.randn([3, 4])
|
||
>>> paddle.tensor.random.gaussian_(x)
|
||
>>> print(x)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 1.84037554, -1.04185271, 1.04286408, 0.48108253],
|
||
[-0.84185606, 0.18335205, 0.07997673, -0.56327361],
|
||
[-1.30208957, -0.20095424, 0.13392292, 0.68311596]])
|
||
>>> # doctest: -SKIP
|
||
"""
|
||
if isinstance(mean, complex):
|
||
if x.dtype not in [
|
||
core.VarDesc.VarType.COMPLEX64,
|
||
core.VarDesc.VarType.COMPLEX128,
|
||
core.DataType.COMPLEX64,
|
||
core.DataType.COMPLEX128,
|
||
]:
|
||
raise TypeError(
|
||
"if mean is a complex number, x's dtype should be complex64 or complex128, "
|
||
f"but dtype = {x.dtype}",
|
||
)
|
||
if mean.real != mean.imag:
|
||
raise ValueError(
|
||
"The mean of complex gaussian distribution should be a complex number with "
|
||
f"real part equal imaginary part, but got {mean.real} != {mean.imag}",
|
||
)
|
||
mean = mean.real
|
||
return _C_ops.gaussian_inplace_(x, float(mean), float(std), int(seed))
|
||
|
||
|
||
def standard_normal(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a standard
|
||
normal distribution with mean 0 and standard deviation 1, with ``shape``
|
||
and ``dtype``.
|
||
|
||
Args:
|
||
shape (tuple|list|Tensor): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the output Tensor.
|
||
Supported data types: float16, bfloat16, float32, float64, complex64, complex128.
|
||
Default is None, use global default dtype (see ``get_default_dtype``
|
||
for details).
|
||
name (str|None, optional): Name for the operation (optional, default is None).
|
||
For more information, please refer to :ref:`api_guide_Name`.
|
||
out(Tensor, optional): The output tensor.
|
||
device(PlaceLike|None, optional): The desired device of returned tensor.
|
||
if None, uses the current device for the default tensor type (see paddle.device.set_device()).
|
||
device will be the CPU for CPU tensor types and the current CUDA device for CUDA tensor types. Default: None.
|
||
requires_grad(bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a standard
|
||
normal distribution with mean 0 and standard deviation 1, with
|
||
``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # doctest: +SKIP("Random output")
|
||
>>> # example 1: attr shape is a list which doesn't contain Tensor.
|
||
>>> out1 = paddle.standard_normal(shape=[2, 3])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.33719197, -0.25688133, -0.42868865],
|
||
[-0.27804616, -0.25058213, -0.28209466]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 2: attr shape is a list which contains Tensor.
|
||
>>> dim1 = paddle.to_tensor(2, 'int64')
|
||
>>> dim2 = paddle.to_tensor(3, 'int32')
|
||
>>> out2 = paddle.standard_normal(shape=[dim1, dim2, 2])
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[[ 0.81888396, -0.64831746],
|
||
[ 1.28911388, -1.88154876],
|
||
[-0.03271919, -0.32410008]],
|
||
[[-0.20224631, 0.46683890],
|
||
[ 1.91947734, 0.71657443],
|
||
[ 0.33410960, -0.64256823]]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 3: attr shape is a Tensor, the data type must be int64 or int32.
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out3 = paddle.standard_normal(shape_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.01182475, -0.44895259, -1.79227340],
|
||
[ 1.52022707, -0.83830303, 0.05261501]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 4: attr dtype is complex64.
|
||
>>> paddle.seed(200)
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out4 = paddle.standard_normal(shape_tensor, dtype='complex64')
|
||
>>> print(out4)
|
||
Tensor(shape=[2, 3], dtype=complex64, place=Place(cpu), stop_gradient=True,
|
||
[[ (0.13755313+0.09320746j), (0.79550129-0.41801897j),
|
||
(-0.67300206-0.09163689j)],
|
||
[ (0.17453042-0.90028328j), (0.16270922-1.30863023j),
|
||
(0.94287461+0.06869461j)]])
|
||
"""
|
||
|
||
if dtype is not None and not isinstance(
|
||
dtype, (core.VarDesc.VarType, core.DataType)
|
||
):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
if dtype in [
|
||
core.VarDesc.VarType.COMPLEX64,
|
||
core.VarDesc.VarType.COMPLEX64,
|
||
]:
|
||
return gaussian(
|
||
shape=shape,
|
||
mean=(0.0 + 0.0j),
|
||
std=1.0,
|
||
dtype=dtype,
|
||
name=name,
|
||
out=out,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
else:
|
||
return gaussian(
|
||
shape=shape,
|
||
mean=0.0,
|
||
std=1.0,
|
||
dtype=dtype,
|
||
name=name,
|
||
out=out,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
else:
|
||
return gaussian(
|
||
shape=shape,
|
||
mean=0.0,
|
||
std=1.0,
|
||
dtype=dtype,
|
||
name=name,
|
||
out=out,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
|
||
|
||
@overload
|
||
def randn(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@overload
|
||
def randn(
|
||
*size: int,
|
||
out: paddle.Tensor | None = None,
|
||
dtype: DTypeLike | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@size_args_decorator
|
||
def randn(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a standard
|
||
normal distribution with mean 0 and standard deviation 1, with ``shape``
|
||
and ``dtype``.
|
||
|
||
Args:
|
||
shape (tuple|list|Tensor|*shape): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list.
|
||
If ``shape`` is *shape, directly pass integers as variable-length arguments (e.g., `randn(2, 3)`).
|
||
alias: ``size``.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the output Tensor.
|
||
Supported data types: float16, bfloat16, float32, float64, complex64, complex128.
|
||
Default is None, use global default dtype (see ``get_default_dtype``
|
||
for details).
|
||
name (str|None, optional): Name for the operation (optional, default is None).
|
||
For more information, please refer to :ref:`api_guide_Name`.
|
||
out(Tensor, optional): The output tensor.
|
||
device(PlaceLike|None, optional): The desired device of returned tensor.
|
||
pin_memory(bool, optional): If set, return tensor would be allocated in the pinned memory. Works only for CPU tensors. Default: False
|
||
requires_grad(bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a standard
|
||
normal distribution with mean 0 and standard deviation 1, with
|
||
``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1: attr shape is a list which doesn't contain Tensor.
|
||
>>> out1 = paddle.randn(shape=[2, 3])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.29270014, -0.02925120, -1.07807338],
|
||
[ 1.19966674, -0.46673676, -0.18050613]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 2: attr shape is a list which contains Tensor.
|
||
>>> dim1 = paddle.to_tensor(2, 'int64')
|
||
>>> dim2 = paddle.to_tensor(3, 'int32')
|
||
>>> out2 = paddle.randn(shape=[dim1, dim2, 2])
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[[-0.26019713, 0.54994684],
|
||
[ 0.46403214, -1.41178775],
|
||
[-0.15682915, -0.26639181]],
|
||
[[ 0.01364388, -2.81676364],
|
||
[ 0.86996621, 0.07524570],
|
||
[ 0.21443737, 0.90938759]]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 3: attr shape is a Tensor, the data type must be int64 or int32.
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out3 = paddle.randn(shape_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.57575506, -1.60349274, -0.27124876],
|
||
[ 1.08381045, 0.81270242, -0.26763600]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 4: attr dtype is complex64.
|
||
>>> paddle.seed(200)
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out4 = paddle.randn(shape_tensor, dtype='complex64')
|
||
>>> print(out4)
|
||
Tensor(shape=[2, 3], dtype=complex64, place=Place(cpu), stop_gradient=True,
|
||
[[ (0.13755313+0.09320746j), (0.79550129-0.41801897j),
|
||
(-0.67300206-0.09163689j)],
|
||
[ (0.17453042-0.90028328j), (0.16270922-1.30863023j),
|
||
(0.94287461+0.06869461j)]])
|
||
|
||
>>> # example 5: attr shape is *shape (integers as variable-length arguments).
|
||
>>> paddle.seed(200)
|
||
>>> out5 = paddle.randn(2, 3)
|
||
>>> print(out5)
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.19452949, 0.13181525, 1.12500870],
|
||
[-0.59116811, -0.95176864, -0.12959413]])
|
||
"""
|
||
device = (
|
||
_get_paddle_place(device)
|
||
if device is not None
|
||
else _current_expected_place()
|
||
)
|
||
if pin_memory and in_dynamic_mode() and device is not None:
|
||
device = _to_pinned_place(device)
|
||
tensor = standard_normal(
|
||
shape,
|
||
dtype,
|
||
name,
|
||
out=out,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
if pin_memory and in_dynamic_mode():
|
||
tensor = tensor.pin_memory()
|
||
return tensor
|
||
|
||
|
||
@param_one_alias(["x", "input"])
|
||
def randn_like(
|
||
x: Tensor,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
device: PlaceLike | None = None,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a tensor with the same size as input that is filled with random numbers from a normal distribution with mean 0 and variance 1.
|
||
|
||
Args:
|
||
x (Tensor): The input multi-dimensional tensor which specifies shape. The dtype of ``x``
|
||
can be float16, bfloat16, float32, float64, complex64, complex128.
|
||
alias: ``input``.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the
|
||
output tensor. Supported data types: float16, bfloat16, float32, float64, complex64, complex128. If ``dtype`` is None, the data type is the
|
||
same as x's data type. Default is None.
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
device (str|paddle.Place|None, optional): The device on which to place the created tensor.
|
||
If None, the device is the same as input's device. Default is None.
|
||
requires_grad (bool, optional): Whether to compute gradients for the created tensor.
|
||
Default is False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor with the same size as input that is filled with random numbers from a normal distribution with mean 0 and variance 1.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1:
|
||
>>> # dtype is None and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out1 = paddle.randn_like(x)
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.51785558, -0.10632933]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out1.dtype)
|
||
paddle.float32
|
||
|
||
>>> # example 2:
|
||
>>> # dtype is None and the dtype of x is float64
|
||
>>> x = paddle.zeros((1, 2)).astype("float64")
|
||
>>> out2 = paddle.randn_like(x)
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.64437317, -1.26898670]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out2.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 3:
|
||
>>> # dtype is float64 and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out3 = paddle.randn_like(x, dtype="float64")
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[ 1.45264642, -1.33133914]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out3.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 4:
|
||
>>> # device and requires_grad are provided
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out4 = paddle.randn_like(x, device=paddle.CPUPlace(), requires_grad=True)
|
||
>>> print(out4)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float32, place=Place(cpu), stop_gradient=False,
|
||
[[0.78040242, 0.29628819]])
|
||
"""
|
||
if dtype is None:
|
||
dtype = x.dtype
|
||
if device is None:
|
||
device = x.place
|
||
shape = paddle.shape(x)
|
||
|
||
return randn(
|
||
shape=shape,
|
||
dtype=dtype,
|
||
name=name,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
|
||
|
||
def rand_like(
|
||
input,
|
||
name: str | None = None,
|
||
*,
|
||
dtype: DTypeLike | None = None,
|
||
device: PlaceLike | None = None,
|
||
requires_grad: bool = False,
|
||
):
|
||
"""
|
||
Returns a tensor with the same size as input that is filled with random numbers from a uniform distribution on the interval [0, 1).
|
||
|
||
Args:
|
||
input (Tensor): The input multi-dimensional tensor which specifies shape. The dtype of ``input``
|
||
can be float16, float64, float8_e4m3fn, float32, bfloat16.
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the
|
||
output tensor. Supported data types: float16, float64, float8_e4m3fn, float32, bfloat16.
|
||
If ``dtype`` is None, the data type is the same as input's data type. Default is None.
|
||
device (str|paddle.Place|None, optional): The device on which to place the created tensor.
|
||
If None, the device is the same as input's device. Default is None.
|
||
requires_grad (bool, optional): Whether to compute gradients for the created tensor.
|
||
Default is False.
|
||
|
||
Returns:
|
||
Tensor: A Tensor with the same size as input that is filled with random numbers from a uniform distribution on the interval [0, 1).
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1:
|
||
>>> # dtype is None and the dtype of input is float32
|
||
>>> x = paddle.zeros((2, 3)).astype("float32")
|
||
>>> out1 = paddle.rand_like(x)
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.34962332, 0.82356787, 0.91275704],
|
||
[0.12328923, 0.58439839, 0.32735515]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out1.dtype)
|
||
paddle.float32
|
||
|
||
>>> # example 2:
|
||
>>> # dtype is None and the dtype of input is float64
|
||
>>> x = paddle.zeros((2, 3)).astype("float64")
|
||
>>> out2 = paddle.rand_like(x)
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[0.73964721, 0.28413662, 0.91918457],
|
||
[0.62838351, 0.39185921, 0.51561823]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out2.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 3:
|
||
>>> # dtype is float64 and the dtype of input is float32
|
||
>>> x = paddle.zeros((2, 3)).astype("float32")
|
||
>>> out3 = paddle.rand_like(x, dtype="float64")
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[0.84492219, 0.11572551, 0.73868765],
|
||
[0.90269387, 0.45644298, 0.28739912]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out3.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 4:
|
||
>>> # with requires_grad=True
|
||
>>> x = paddle.zeros((2, 2)).astype("float32")
|
||
>>> out4 = paddle.rand_like(x, requires_grad=True)
|
||
>>> print(out4.stop_gradient)
|
||
False
|
||
"""
|
||
if dtype is None:
|
||
dtype = input.dtype
|
||
if device is None:
|
||
device = input.place
|
||
shape = paddle.shape(input)
|
||
|
||
return rand(
|
||
shape=shape,
|
||
dtype=dtype,
|
||
name=name,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
|
||
|
||
@param_one_alias(["shape", "size"])
|
||
def normal(
|
||
mean: complex | Tensor = 0.0,
|
||
std: float | Tensor = 1.0,
|
||
shape: ShapeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a normal
|
||
distribution with ``mean`` and ``std`` (standard deviation).
|
||
|
||
If ``mean`` is a Tensor, the output Tensor has the same shape and data type as ``mean``.
|
||
If ``mean`` is not a Tensor and ``std`` is a Tensor, the output Tensor has the same shape and data type as ``std``.
|
||
If ``mean`` and ``std`` are not a Tensor, the output Tensor has the same shape as ``shape``, with data type float32.
|
||
|
||
If ``mean`` and ``std`` are Tensor, the num of elements of ``mean`` and ``std`` should be the same.
|
||
|
||
If ``mean`` is a complex number, the output Tensor follows complex normal distribution, with data type complex64.
|
||
If ``mean`` is a Tensor with complex data type, the output Tensor has same data type with ``mean``.
|
||
|
||
.. note::
|
||
Alias Support: The parameter name ``size`` can be used as an alias for ``shape``.
|
||
For example, ``normal(size=[2, 3], ...)`` is equivalent to ``normal(shape=[2, 3], ...)``.
|
||
|
||
Args:
|
||
mean (float|complex|Tensor, optional): The mean of the output Tensor's normal distribution.
|
||
If ``mean`` is float, all elements of the output Tensor shared the same mean.
|
||
If ``mean`` is a Tensor(data type supports float32, float64, complex64, complex128), it has per-element means.
|
||
Default is 0.0
|
||
std (float|Tensor, optional): The standard deviation of the output Tensor's normal distribution.
|
||
If ``std`` is float, all elements of the output Tensor shared the same standard deviation.
|
||
If ``std`` is a Tensor(data type supports float32, float64), it has per-element standard deviations.
|
||
Default is 1.0
|
||
shape (tuple|list|Tensor|None, optional): Shape of the Tensor to be created. The data type is ``int32`` or ``int64``.
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list. If ``mean`` or ``std``
|
||
is a Tensor, the shape of the output Tensor is the same as ``mean`` or ``std``, attr ``shape`` is ignored.
|
||
Default is None
|
||
name (str|None, optional): Name for the operation (optional, default is None).
|
||
For more information, please refer to :ref:`api_guide_Name`.
|
||
out (Tensor|None, optional): Optional output tensor. If provided, the result will be stored in this tensor.
|
||
The ``out`` tensor must have the same shape and dtype as the expected output. Default is None.
|
||
|
||
Returns:
|
||
Tensor: A Tensor filled with random values sampled from a normal distribution with ``mean`` and ``std``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> out1 = paddle.normal(shape=[2, 3])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.85107994, -0.85490644, -1.35941815],
|
||
[-0.55500370, 0.20964541, 2.24193954]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> mean_tensor = paddle.to_tensor([1.0, 2.0, 3.0])
|
||
>>> out2 = paddle.normal(mean=mean_tensor)
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[1.05411839, 3.71514320, 3.42665267])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> std_tensor = paddle.to_tensor([1.0, 2.0, 3.0])
|
||
>>> out3 = paddle.normal(mean=mean_tensor, std=std_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[0.48646951, 0.00815189, 3.74022293])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> paddle.seed(200)
|
||
>>> out4 = paddle.normal(mean=1 + 1j, shape=[2, 3])
|
||
>>> print(out4)
|
||
Tensor(shape=[2, 3], dtype=complex64, place=Place(cpu), stop_gradient=True,
|
||
[[(1.13755310+1.09320748j), (1.79550123+0.58198106j),
|
||
(0.32699794+0.90836310j)],
|
||
[(1.17453039+0.09971672j), (1.16270924-0.30863023j),
|
||
(1.94287467+1.06869459j)]])
|
||
|
||
>>> mean_tensor = paddle.to_tensor([1 + 1j, 2 + 2j, 3 + 3j])
|
||
>>> out5 = paddle.normal(mean=mean_tensor)
|
||
>>> print(out5)
|
||
Tensor(shape=[3], dtype=complex64, place=Place(cpu), stop_gradient=True,
|
||
[(1.13600969-0.11074114j), (2.52933168+2.19687510j),
|
||
(2.29101014+1.81147802j)])
|
||
"""
|
||
if not in_dynamic_mode():
|
||
check_type(
|
||
mean,
|
||
'mean',
|
||
(int, float, complex, Variable, paddle.pir.Value),
|
||
'normal',
|
||
)
|
||
check_type(
|
||
std, 'std', (int, float, Variable, paddle.pir.Value), 'normal'
|
||
)
|
||
if isinstance(mean, (Variable, paddle.pir.Value)):
|
||
check_dtype(
|
||
mean.dtype,
|
||
'mean',
|
||
['float32', 'float64', 'complex64', 'complex128'],
|
||
'normal',
|
||
"If mean is Tensor, it's data type only support float32, float64, complex64, complex128.",
|
||
)
|
||
if isinstance(std, (Variable, paddle.pir.Value)):
|
||
check_dtype(
|
||
std.dtype,
|
||
'std',
|
||
['float32', 'float64'],
|
||
'normal',
|
||
"If std is Tensor, it's data type only support float32, float64.",
|
||
)
|
||
if shape is not None:
|
||
check_shape(shape, 'normal')
|
||
|
||
if isinstance(mean, complex):
|
||
if isinstance(std, float):
|
||
return gaussian(
|
||
shape=shape,
|
||
mean=mean,
|
||
std=std,
|
||
dtype='complex64',
|
||
name=name,
|
||
out=out,
|
||
)
|
||
else:
|
||
out_tensor = gaussian(
|
||
shape=paddle.shape(std),
|
||
mean=(0.0 + 0.0j),
|
||
std=1.0,
|
||
dtype='complex64',
|
||
name=name,
|
||
)
|
||
elif isinstance(mean, (Variable, paddle.pir.Value)):
|
||
if mean.dtype in [
|
||
core.VarDesc.VarType.COMPLEX64,
|
||
core.VarDesc.VarType.COMPLEX128,
|
||
core.DataType.COMPLEX64,
|
||
core.DataType.COMPLEX128,
|
||
]:
|
||
if isinstance(std, (Variable, paddle.pir.Value)):
|
||
mean_shape = paddle.shape(mean)
|
||
std = paddle.reshape(std, mean_shape)
|
||
else:
|
||
std = float(std)
|
||
out_tensor = gaussian(
|
||
shape=paddle.shape(mean),
|
||
mean=(0.0 + 0.0j),
|
||
std=1.0,
|
||
dtype=mean.dtype,
|
||
name=name,
|
||
)
|
||
else:
|
||
if isinstance(std, (Variable, paddle.pir.Value)):
|
||
if std.dtype != mean.dtype:
|
||
std = paddle.cast(std, mean.dtype)
|
||
mean_shape = paddle.shape(mean)
|
||
std = paddle.reshape(std, mean_shape)
|
||
else:
|
||
std = float(std)
|
||
out_tensor = standard_normal(paddle.shape(mean), mean.dtype, name)
|
||
elif isinstance(std, (Variable, paddle.pir.Value)):
|
||
mean = float(mean)
|
||
out_tensor = standard_normal(paddle.shape(std), std.dtype, name)
|
||
else:
|
||
return gaussian(shape=shape, mean=mean, std=std, name=name, out=out)
|
||
|
||
out_tensor = out_tensor * std + mean
|
||
if not in_dynamic_or_pir_mode():
|
||
out_tensor.stop_gradient = True
|
||
if out is not None:
|
||
paddle.assign(out_tensor, out)
|
||
out_tensor = out
|
||
|
||
return out_tensor
|
||
|
||
|
||
@dygraph_only
|
||
def normal_(
|
||
x: Tensor, mean: complex = 0.0, std: float = 1.0, name: str | None = None
|
||
) -> Tensor:
|
||
"""
|
||
This is the inplace version of api ``normal``, which returns a Tensor filled
|
||
with random values sampled from a normal distribution. The output Tensor will
|
||
be inplaced with input ``x``. Please refer to :ref:`api_paddle_normal`.
|
||
|
||
Args:
|
||
x(Tensor): The input tensor to be filled with random values.
|
||
mean (float|int|complex, optional): Mean of the output tensor, default is 0.0.
|
||
std (float|int, optional): Standard deviation of the output tensor, default
|
||
is 1.0.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a normal distribution with ``mean`` and ``std`` .
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> x = paddle.randn([3, 4])
|
||
>>> x.normal_()
|
||
>>> # doctest: +SKIP('random check')
|
||
>>> print(x)
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.06132207, 1.11349595, 0.41906244, -0.24858207],
|
||
[-1.85169315, -1.50370061, 1.73954511, 0.13331604],
|
||
[ 1.66359663, -0.55764782, -0.59911072, -0.57773495]])
|
||
|
||
"""
|
||
return gaussian_(x, mean=mean, std=std)
|
||
|
||
|
||
def uniform(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
min: float = 0,
|
||
max: float = 1.0,
|
||
seed: int = 0,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a uniform
|
||
distribution in the range [``min``, ``max``), with ``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
|
||
.. code-block:: text
|
||
|
||
Input:
|
||
shape = [1, 2]
|
||
Output:
|
||
result=[[0.8505902, 0.8397286]]
|
||
|
||
Args:
|
||
shape (tuple|list|Tensor): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list.
|
||
dtype(str|paddle.dtype|np.dtype, optional): The data type of the output Tensor.
|
||
Supported data types: float32, float64, complex64, complex128.
|
||
Default is None, use global default dtype (see ``get_default_dtype``
|
||
for details).
|
||
min(float|int, optional): The lower bound on the range of random values
|
||
to generate, ``min`` is included in the range. Default is 0.
|
||
max(float|int, optional): The upper bound on the range of random values
|
||
to generate, ``max`` is excluded in the range. Default is 1.0.
|
||
seed(int, optional): Random seed used for generating samples. If seed is 0,
|
||
it will use the seed of the global default generator (which can be set by paddle.seed).
|
||
Note that if seed is not 0, this operator will always generate the same random numbers every
|
||
time. Default is 0.
|
||
name(str|None, optional): Name for the operation (optional, default is None).
|
||
For more information, please refer to :ref:`api_guide_Name`.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a uniform
|
||
distribution in the range [``min``, ``max``), with ``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
:name: code-example1
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1:
|
||
>>> # attr shape is a list which doesn't contain Tensor.
|
||
>>> out1 = paddle.uniform(shape=[3, 4])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0.38170254, -0.47945309, 0.39794648, -0.94233936],
|
||
[-0.85296679, -0.76094693, 0.10565400, 0.59155810],
|
||
[ 0.11681318, -0.42144555, -0.81596589, 0.62113667]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 2:
|
||
>>> # attr shape is a list which contains Tensor.
|
||
>>> dim1 = paddle.to_tensor(2, 'int64')
|
||
>>> dim2 = paddle.to_tensor(3, 'int32')
|
||
>>> out2 = paddle.uniform(shape=[dim1, dim2])
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.00294012, -0.07210171, -0.44236207],
|
||
[ 0.70089281, 0.21500075, -0.22084606]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 3:
|
||
>>> # attr shape is a Tensor, the data type must be int64 or int32.
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out3 = paddle.uniform(shape_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.60801756, 0.32448411, 0.90269291],
|
||
[-0.66421294, -0.95218551, -0.51022208]])
|
||
>>> # doctest: -SKIP
|
||
"""
|
||
supported_dtypes = [
|
||
'float32',
|
||
'float64',
|
||
'float16',
|
||
'uint16',
|
||
'complex64',
|
||
'complex128',
|
||
]
|
||
if dtype is None:
|
||
dtype = paddle.framework.get_default_dtype()
|
||
if dtype not in supported_dtypes:
|
||
raise TypeError(
|
||
f"uniform/rand only supports {supported_dtypes}, but the default dtype is {dtype}"
|
||
)
|
||
|
||
if not isinstance(dtype, (core.VarDesc.VarType, core.DataType)):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
|
||
if in_dynamic_mode():
|
||
shape = paddle.utils.convert_shape_to_list(shape)
|
||
place = (
|
||
_current_expected_place()
|
||
if device is None
|
||
else _get_paddle_place(device)
|
||
)
|
||
tensor = _C_ops.uniform(
|
||
shape,
|
||
dtype,
|
||
float(min),
|
||
float(max),
|
||
seed,
|
||
place,
|
||
out=out,
|
||
)
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
return tensor
|
||
elif in_pir_mode():
|
||
check_type(
|
||
shape, 'shape', (list, tuple, paddle.pir.Value), 'uniform/rand'
|
||
)
|
||
check_dtype(dtype, 'dtype', supported_dtypes, 'uniform/rand')
|
||
check_type(min, 'min', (float, int, paddle.pir.Value), 'uniform/rand')
|
||
check_type(max, 'max', (float, int, paddle.pir.Value), 'uniform/rand')
|
||
if paddle.utils._contain_var(shape):
|
||
shape = paddle.utils.get_int_tensor_list(shape)
|
||
if isinstance(min, int):
|
||
min = float(min)
|
||
if isinstance(max, int):
|
||
max = float(max)
|
||
|
||
place = (
|
||
_current_expected_place()
|
||
if device is None
|
||
else _get_paddle_place(device)
|
||
)
|
||
tensor = _C_ops.uniform(
|
||
shape,
|
||
dtype,
|
||
min,
|
||
max,
|
||
seed,
|
||
place,
|
||
out=out,
|
||
)
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
return tensor
|
||
else:
|
||
check_type(shape, 'shape', (list, tuple, Variable), 'uniform/rand')
|
||
check_dtype(dtype, 'dtype', supported_dtypes, 'uniform/rand')
|
||
check_type(min, 'min', (float, int, Variable), 'uniform/rand')
|
||
check_type(max, 'max', (float, int, Variable), 'uniform/rand')
|
||
|
||
inputs = {}
|
||
attrs = {'seed': seed, 'min': min, 'max': max, 'dtype': dtype}
|
||
paddle.utils.get_shape_tensor_inputs(
|
||
inputs=inputs, attrs=attrs, shape=shape, op_type='uniform/rand'
|
||
)
|
||
|
||
helper = LayerHelper("uniform", **locals())
|
||
out = helper.create_variable_for_type_inference(dtype)
|
||
helper.append_op(
|
||
type="uniform_random",
|
||
inputs=inputs,
|
||
attrs=attrs,
|
||
outputs={"Out": out},
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
@param_two_alias(["min", "from"], ["max", "to"])
|
||
@dygraph_only
|
||
def uniform_(
|
||
x: Tensor,
|
||
min: float = 0,
|
||
max: float = 1.0,
|
||
seed: int = 0,
|
||
name: str | None = None,
|
||
) -> Tensor:
|
||
"""
|
||
This is the inplace version of OP ``uniform``, which returns a Tensor filled
|
||
with random values sampled from a uniform distribution. The output Tensor will
|
||
be inplaced with input ``x``. Please refer to :ref:`api_paddle_uniform`.
|
||
|
||
Args:
|
||
x(Tensor): The input tensor to be filled with random values.
|
||
min(float|int, optional): The lower bound on the range of random values
|
||
to generate, ``min`` is included in the range. Default is 0.
|
||
Alias: ``from``.
|
||
max(float|int, optional): The upper bound on the range of random values
|
||
to generate, ``max`` is excluded in the range. Default is 1.0.
|
||
Alias: ``to``.
|
||
seed(int, optional): Random seed used for generating samples. If seed is 0,
|
||
it will use the seed of the global default generator (which can be set by paddle.seed).
|
||
Note that if seed is not 0, this operator will always generate the same random numbers every
|
||
time. Default is 0.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
|
||
Returns:
|
||
Tensor, The input tensor x filled with random values sampled from a uniform
|
||
distribution in the range [``min``, ``max``).
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example:
|
||
>>> x = paddle.ones(shape=[3, 4])
|
||
>>> x.uniform_()
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[-0.50484276, 0.49580324, 0.33357990, -0.93924278],
|
||
[ 0.39779735, 0.87677515, -0.24377221, 0.06212139],
|
||
[-0.92499518, -0.96244860, 0.79210341, -0.78228098]])
|
||
>>> # doctest: -SKIP
|
||
"""
|
||
return _C_ops.uniform_inplace_(x, min, max, seed, 0, 0, 1.0)
|
||
|
||
|
||
@overload
|
||
def randint(
|
||
low: int = 0,
|
||
high: int | None = None,
|
||
size: ShapeLike = [1],
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@overload
|
||
def randint(
|
||
high: int,
|
||
size: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@param_one_alias(["shape", "size"])
|
||
def randint(
|
||
low: int = 0,
|
||
high: int | None = None,
|
||
shape: ShapeLike = [1],
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random integers from a discrete uniform
|
||
distribution in the range [``low``, ``high``), with ``shape`` and ``dtype``.
|
||
If ``high`` is None (the default), the range is [0, ``low``).
|
||
|
||
Args:
|
||
low (int, optional): The lower bound on the range of random values to generate.
|
||
The ``low`` is included in the range. If ``high`` is None, the
|
||
range is [0, ``low``). Default is 0.
|
||
high (int, optional): The upper bound on the range of random values to
|
||
generate, the ``high`` is excluded in the range. Default is None
|
||
(see above for behavior if high = None). Default is None.
|
||
shape (tuple|list|Tensor): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list. Default is [1].
|
||
Alias: ``size``.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the
|
||
output tensor. Supported data types: int32, int64. If ``dtype``
|
||
is None, the data type is int64. Default is None.
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
|
||
Keyword Arguments:
|
||
out (Tensor, optional): Optional output tensor. If provided, the result will be stored in this tensor. Default: None.
|
||
device (PlaceLike|None, optional): The desired device of returned tensor. Default: None.
|
||
pin_memory (bool, optional): If set, return tensor would be allocated in the pinned memory. Works only for CPU tensors. Default: False.
|
||
requires_grad (bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random integers from a discrete uniform
|
||
distribution in the range [``low``, ``high``), with ``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1:
|
||
>>> # attr size is a list which doesn't contain Tensor.
|
||
>>> out1 = paddle.randint(low=-5, high=5, size=[2, 3])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[-1, 4, 4],
|
||
[-2, -5, -2]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 2:
|
||
>>> # attr size is a list which contains Tensor.
|
||
>>> dim1 = paddle.to_tensor(2, 'int64')
|
||
>>> dim2 = paddle.to_tensor(3, 'int32')
|
||
>>> out2 = paddle.randint(low=-5, high=5, size=[dim1, dim2])
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[-4, -4, 2],
|
||
[-3, -1, -5]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 3:
|
||
>>> # attr size is a Tensor
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out3 = paddle.randint(low=-5, high=5, size=shape_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[-1, 4, -3],
|
||
[ 1, 2, -1]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 4:
|
||
>>> # data type is int32
|
||
>>> out4 = paddle.randint(low=-5, high=5, size=[3], dtype='int32')
|
||
>>> print(out4)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[3], dtype=int32, place=Place(cpu), stop_gradient=True,
|
||
[4, 4, 0])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 5:
|
||
>>> # Input only one parameter
|
||
>>> # low=0, high=10, shape=[1], dtype='int64'
|
||
>>> out5 = paddle.randint(10)
|
||
>>> print(out5)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[7])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 6:
|
||
>>> # Use 'size' as an alias for 'shape'
|
||
>>> out6 = paddle.randint(high=10, size=[2, 3])
|
||
>>> print(out6.shape)
|
||
paddle.Size([2, 3])
|
||
|
||
>>> # example 7:
|
||
>>> # Use requires_grad=True so that stop_gradient=False
|
||
>>> out7 = paddle.randint(high=10, size=[2, 3], requires_grad=True)
|
||
>>> print(out7.stop_gradient)
|
||
False
|
||
|
||
"""
|
||
if isinstance(high, (list, tuple)):
|
||
shape = high
|
||
high = low
|
||
low = 0
|
||
elif high is None:
|
||
if low <= 0:
|
||
raise ValueError(
|
||
f"If high is None, low must be greater than 0, but received low = {low}."
|
||
)
|
||
high = low
|
||
low = 0
|
||
if dtype is None:
|
||
dtype = core.VarDesc.VarType.INT64
|
||
if use_pir_api():
|
||
dtype = DataType.INT64
|
||
elif not isinstance(dtype, (core.VarDesc.VarType, core.DataType)):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
|
||
place = (
|
||
_get_paddle_place(device)
|
||
if device is not None
|
||
else _current_expected_place()
|
||
)
|
||
if pin_memory and in_dynamic_mode():
|
||
place = _to_pinned_place(place)
|
||
|
||
if in_dynamic_mode():
|
||
shape = paddle.utils.convert_shape_to_list(shape)
|
||
tensor = _C_ops.randint(low, high, shape, dtype, place, out=out)
|
||
if pin_memory:
|
||
tensor = tensor.pin_memory()
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
return tensor
|
||
elif in_pir_mode():
|
||
check_shape(shape, 'randint')
|
||
check_dtype(dtype, 'dtype', ['int32', 'int64'], 'randint')
|
||
if paddle.utils._contain_var(shape):
|
||
shape = paddle.utils.get_int_tensor_list(shape)
|
||
tensor = _C_ops.randint(low, high, shape, dtype, place, out=out)
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
return tensor
|
||
else:
|
||
check_shape(shape, 'randint')
|
||
check_dtype(dtype, 'dtype', ['int32', 'int64'], 'randint')
|
||
if low >= high:
|
||
raise ValueError(
|
||
f"randint's low must less then high, but received low = {low}, "
|
||
f"high = {high}"
|
||
)
|
||
|
||
inputs = {}
|
||
attrs = {'low': low, 'high': high, 'seed': 0, 'dtype': dtype}
|
||
paddle.utils.get_shape_tensor_inputs(
|
||
inputs=inputs, attrs=attrs, shape=shape, op_type='randint'
|
||
)
|
||
|
||
helper = LayerHelper("randint", **locals())
|
||
if out is None:
|
||
out = helper.create_variable_for_type_inference(dtype=dtype)
|
||
helper.append_op(
|
||
type='randint', inputs=inputs, outputs={'Out': out}, attrs=attrs
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
def random_(
|
||
x: Tensor,
|
||
from_: int = 0,
|
||
to: int | None = None,
|
||
*,
|
||
generator: None = None,
|
||
) -> Tensor:
|
||
"""
|
||
Fills self tensor with numbers sampled from the discrete uniform distribution over [from, to - 1].
|
||
If not specified, the values are usually only bounded by self tensor’s data type. However,
|
||
for floating point types, if unspecified, range will be [0, 2^mantissa] to ensure that every value is representable.
|
||
|
||
Args:
|
||
from (int, optional): The lower bound on the range of random values to generate. Default is 0.
|
||
to (int|None, optional): The upper bound on the range of random values to generate. Default is None.
|
||
generator (None): Placeholder for random number generator (currently not implemented, reserved for future use).
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random integers from a discrete uniform
|
||
distribution in the range [``from``, ``to``).
|
||
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> x = paddle.zeros([3], dtype=paddle.int32)
|
||
>>> x.random_(0, 10)
|
||
"""
|
||
dtype = x.dtype
|
||
if to is None:
|
||
if from_ == 0:
|
||
if paddle.is_floating_point(x):
|
||
if dtype == paddle.float32:
|
||
mantissa = 24
|
||
elif dtype == paddle.float64:
|
||
mantissa = 53
|
||
elif dtype == paddle.float16:
|
||
mantissa = 11
|
||
else:
|
||
mantissa = 8
|
||
to = 2**mantissa
|
||
else:
|
||
to = paddle.iinfo(dtype).max
|
||
else:
|
||
to = from_
|
||
from_ = 0
|
||
|
||
if from_ >= to:
|
||
raise ValueError(
|
||
f"random_ expects 'from' to be less than 'to', but got from={from_} >= to={to}"
|
||
)
|
||
return _C_ops.random_(x, from_, to)
|
||
|
||
|
||
@param_one_alias(["x", "input"])
|
||
def randint_like(
|
||
x: Tensor,
|
||
low: int = 0,
|
||
high: int | None = None,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random integers from a discrete uniform
|
||
distribution in the range [``low``, ``high``), with the same shape as ``x``.
|
||
(use ``dtype`` if ``dtype`` is not None)
|
||
If ``high`` is None (the default), the range is [0, ``low``).
|
||
|
||
Args:
|
||
x (Tensor): The input multi-dimensional tensor which specifies shape. The dtype of ``x``
|
||
can be bool, int32, int64, float16, float32, float64.
|
||
low (int, optional): The lower bound on the range of random values to generate.
|
||
The ``low`` is included in the range. If ``high`` is None, the
|
||
range is [0, ``low``). Default is 0.
|
||
high (int|None, optional): The upper bound on the range of random values to
|
||
generate, the ``high`` is excluded in the range. Default is None.
|
||
If ``high`` is None, the range is [0, ``low``).
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the
|
||
output tensor. Supported data types: bool, int32, int64, float16,
|
||
float32, float64. If ``dtype`` is None, the data type is the
|
||
same as x's data type. Default is None.
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
|
||
Keyword Args:
|
||
device (PlaceLike|None, optional): The desired device of returned tensor.
|
||
Default: if ``None``, defaults to the device of ``x``.
|
||
pin_memory (bool, optional): If set, return tensor would be allocated in the pinned memory.
|
||
Works only for CPU tensors. Default: False.
|
||
requires_grad (bool, optional): If autograd should record operations on the
|
||
returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random integers from a discrete uniform
|
||
distribution in the range [``low``, ``high``), with ``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1:
|
||
>>> # dtype is None and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out1 = paddle.randint_like(x, low=-5, high=5)
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0., 0.]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out1.dtype)
|
||
paddle.float32
|
||
|
||
>>> # example 2:
|
||
>>> # dtype is None and the dtype of x is float64
|
||
>>> x = paddle.zeros((1, 2)).astype("float64")
|
||
>>> out2 = paddle.randint_like(x, low=-5, high=5)
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[ 4., -5.]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out2.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 3:
|
||
>>> # dtype is None and the dtype of x is int32
|
||
>>> x = paddle.zeros((1, 2)).astype("int32")
|
||
>>> out3 = paddle.randint_like(x, low=-5, high=5)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=int32, place=Place(cpu), stop_gradient=True,
|
||
[[ 0, -4]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out3.dtype)
|
||
paddle.int32
|
||
|
||
>>> # example 4:
|
||
>>> # dtype is None and the dtype of x is int64
|
||
>>> x = paddle.zeros((1, 2)).astype("int64")
|
||
>>> out4 = paddle.randint_like(x, low=-5, high=5)
|
||
>>> print(out4)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[ 4, -3]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out4.dtype)
|
||
paddle.int64
|
||
|
||
>>> # example 5:
|
||
>>> # dtype is float64 and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out5 = paddle.randint_like(x, low=-5, high=5, dtype="float64")
|
||
>>> print(out5)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=float64, place=Place(cpu), stop_gradient=True,
|
||
[[3., 1.]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out5.dtype)
|
||
paddle.float64
|
||
|
||
>>> # example 6:
|
||
>>> # dtype is bool and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out6 = paddle.randint_like(x, low=-5, high=5, dtype="bool")
|
||
>>> print(out6)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=bool, place=Place(cpu), stop_gradient=True,
|
||
[[False, True ]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out6.dtype)
|
||
paddle.bool
|
||
|
||
>>> # example 7:
|
||
>>> # dtype is int32 and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out7 = paddle.randint_like(x, low=-5, high=5, dtype="int32")
|
||
>>> print(out7)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=int32, place=Place(cpu), stop_gradient=True,
|
||
[[-2, -2]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out7.dtype)
|
||
paddle.int32
|
||
|
||
>>> # example 8:
|
||
>>> # dtype is int64 and the dtype of x is float32
|
||
>>> x = paddle.zeros((1, 2)).astype("float32")
|
||
>>> out8 = paddle.randint_like(x, low=-5, high=5, dtype="int64")
|
||
>>> print(out8)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[-5, 4]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out8.dtype)
|
||
paddle.int64
|
||
|
||
>>> # example 9:
|
||
>>> # dtype is int64 and the dtype of x is bool
|
||
>>> x = paddle.zeros((1, 2)).astype("bool")
|
||
>>> out9 = paddle.randint_like(x, low=-5, high=5, dtype="int64")
|
||
>>> print(out9)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[1, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[[ 1, -2]])
|
||
>>> # doctest: -SKIP
|
||
>>> print(out9.dtype)
|
||
paddle.int64
|
||
|
||
"""
|
||
if high is None:
|
||
if low <= 0:
|
||
raise ValueError(
|
||
f"If high is None, low must be greater than 0, but received low = {low}."
|
||
)
|
||
high = low
|
||
low = 0
|
||
if dtype is None:
|
||
dtype = x.dtype
|
||
else:
|
||
if not isinstance(dtype, (core.VarDesc.VarType, core.DataType)):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
shape = paddle.shape(x)
|
||
|
||
if low >= high:
|
||
raise ValueError(
|
||
f"randint_like's low must less then high, but received low = {low}, "
|
||
f"high = {high}"
|
||
)
|
||
|
||
place = (
|
||
_get_paddle_place(device)
|
||
if device is not None
|
||
else _current_expected_place()
|
||
)
|
||
if pin_memory and in_dynamic_mode() and device is not None:
|
||
place = _to_pinned_place(place)
|
||
|
||
if in_dynamic_or_pir_mode():
|
||
if in_dynamic_mode():
|
||
shape = paddle.utils.convert_shape_to_list(shape)
|
||
out = _C_ops.randint(low, high, shape, DataType.INT64, place)
|
||
else:
|
||
check_type(
|
||
shape,
|
||
'shape',
|
||
(list, tuple, paddle.pir.Value),
|
||
'randint_like',
|
||
)
|
||
check_dtype(
|
||
dtype,
|
||
'dtype',
|
||
['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
|
||
'randint_like',
|
||
)
|
||
if paddle.utils._contain_var(shape):
|
||
shape = paddle.utils.get_int_tensor_list(shape)
|
||
out = _C_ops.randint(low, high, shape, DataType.INT64, place)
|
||
out = paddle.cast(out, dtype)
|
||
if pin_memory and in_dynamic_mode():
|
||
out = out.pin_memory()
|
||
if requires_grad is True:
|
||
out.stop_gradient = False
|
||
return out
|
||
else:
|
||
check_shape(shape, 'randint_like')
|
||
check_dtype(
|
||
dtype,
|
||
'dtype',
|
||
['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
|
||
'randint_like',
|
||
)
|
||
|
||
inputs = {"ShapeTensor": shape}
|
||
attrs = {
|
||
'low': low,
|
||
'high': high,
|
||
'seed': 0,
|
||
'dtype': core.VarDesc.VarType.INT64,
|
||
}
|
||
|
||
helper = LayerHelper("randint", **locals())
|
||
out = helper.create_variable_for_type_inference(
|
||
dtype=core.VarDesc.VarType.INT64
|
||
)
|
||
helper.append_op(
|
||
type='randint', inputs=inputs, outputs={'Out': out}, attrs=attrs
|
||
)
|
||
out.stop_gradient = True
|
||
out = paddle.cast(out, dtype)
|
||
return out
|
||
|
||
|
||
def randperm(
|
||
n: int,
|
||
dtype: DTypeLike = "int64",
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a 1-D Tensor filled with random permutation values from 0
|
||
to n-1, with ``dtype``.
|
||
|
||
Args:
|
||
n (int): The upper bound (exclusive), and it should be greater than 0.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of
|
||
the output Tensor. Supported data types: int32, int64, float32,
|
||
float64. Default is int64.
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
out(Tensor, optional): The output tensor.
|
||
device(PlaceLike|None, optional): The desired device of returned tensor.
|
||
pin_memory(bool, optional): If set, return tensor would be allocated in the pinned memory. Works only for CPU tensors. Default: False
|
||
requires_grad(bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A 1-D Tensor filled with random permutation values from 0
|
||
to n-1, with ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> out1 = paddle.randperm(5)
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[5], dtype=int64, place=Place(cpu), stop_gradient=True,
|
||
[3, 0, 1, 4, 2])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> out2 = paddle.randperm(7, 'int32')
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[7], dtype=int32, place=Place(cpu), stop_gradient=True,
|
||
[3, 2, 0, 6, 5, 4, 1])
|
||
>>> # doctest: -SKIP
|
||
|
||
"""
|
||
device = (
|
||
_get_paddle_place(device)
|
||
if device is not None
|
||
else _current_expected_place()
|
||
)
|
||
if pin_memory and in_dynamic_mode() and device is not None:
|
||
device = _to_pinned_place(device)
|
||
|
||
if not isinstance(dtype, (core.VarDesc.VarType, paddle.pir.core.DataType)):
|
||
dtype = convert_nptype_to_datatype_or_vartype(dtype)
|
||
|
||
if in_dynamic_or_pir_mode():
|
||
tensor = _C_ops.randperm(n, dtype, device, out=out)
|
||
if requires_grad is True:
|
||
tensor.stop_gradient = False
|
||
if pin_memory and in_dynamic_mode():
|
||
tensor = tensor.pin_memory()
|
||
return tensor
|
||
else:
|
||
if n < 1:
|
||
raise ValueError(
|
||
"The input n should be greater than 0 in randperm op."
|
||
)
|
||
check_dtype(
|
||
dtype, 'dtype', ['int64', 'int32', 'float32', 'float64'], 'randperm'
|
||
)
|
||
|
||
helper = LayerHelper("randperm", **locals())
|
||
out = helper.create_variable_for_type_inference(dtype)
|
||
attrs = {'n': n, 'dtype': dtype, 'seed': 0}
|
||
helper.append_op(
|
||
type='randperm', inputs={}, outputs={'Out': out}, attrs=attrs
|
||
)
|
||
out.stop_gradient = True
|
||
return out
|
||
|
||
|
||
@overload
|
||
def rand(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@overload
|
||
def rand(
|
||
*size: int,
|
||
out: paddle.Tensor | None = None,
|
||
dtype: DTypeLike | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor: ...
|
||
|
||
|
||
@size_args_decorator
|
||
def rand(
|
||
shape: ShapeLike,
|
||
dtype: DTypeLike | None = None,
|
||
name: str | None = None,
|
||
*,
|
||
out: paddle.Tensor | None = None,
|
||
device: PlaceLike | None = None,
|
||
pin_memory: bool = False,
|
||
requires_grad: bool = False,
|
||
) -> Tensor:
|
||
"""
|
||
Returns a Tensor filled with random values sampled from a uniform
|
||
distribution in the range [0, 1), with ``shape`` and ``dtype``.
|
||
|
||
Args:
|
||
shape (tuple|list|Tensor): Shape of the Tensor to be created. The data type is ``int32`` or ``int64`` .
|
||
If ``shape`` is a list or tuple, each element of it should be integer or 0-D Tensor with shape [].
|
||
If ``shape`` is an Tensor, it should be an 1-D Tensor which represents a list.
|
||
If ``shape`` is *shape, directly pass integers as variable-length arguments (e.g., `rand(2, 3)`).
|
||
alias: ``size``.
|
||
dtype (str|np.dtype|paddle.dtype|None, optional): The data type of the output Tensor.
|
||
Supported data types: float32, float64.
|
||
Default is None, use global default dtype (see :ref:`get_default_dtype`
|
||
for details).
|
||
name (str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
out(Tensor, optional): The output tensor.
|
||
device(PlaceLike|None, optional): The desired device of returned tensor.
|
||
pin_memory(bool, optional): If set, return tensor would be allocated in the pinned memory. Works only for CPU tensors. Default: False
|
||
requires_grad(bool, optional): If autograd should record operations on the returned tensor. Default: False.
|
||
|
||
Returns:
|
||
Tensor, A Tensor filled with random values sampled from a uniform
|
||
distribution in the range [0, 1), with ``shape`` and ``dtype``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
|
||
>>> # example 1: attr shape is a list which doesn't contain Tensor.
|
||
>>> out1 = paddle.rand(shape=[2, 3])
|
||
>>> print(out1)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.68532258, 0.69431782, 0.44835982],
|
||
[0.13204314, 0.48128194, 0.36574543]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 2: attr shape is a list which contains Tensor.
|
||
>>> dim1 = paddle.to_tensor(2, 'int64')
|
||
>>> dim2 = paddle.to_tensor(3, 'int32')
|
||
>>> out2 = paddle.rand(shape=[dim1, dim2, 2])
|
||
>>> print(out2)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[[0.62102991, 0.45255184],
|
||
[0.81386960, 0.22463219],
|
||
[0.87946558, 0.28097662]],
|
||
[[0.36565998, 0.63203937],
|
||
[0.58640617, 0.92696166],
|
||
[0.85060406, 0.38138932]]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 3: attr shape is a Tensor, the data type must be int64 or int32.
|
||
>>> shape_tensor = paddle.to_tensor([2, 3])
|
||
>>> out3 = paddle.rand(shape_tensor)
|
||
>>> print(out3)
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.77650446, 0.12870903, 0.05153799],
|
||
[0.27029657, 0.03963696, 0.42487794]])
|
||
>>> # doctest: -SKIP
|
||
|
||
>>> # example 4: attr shape is *shape (integers as variable-length arguments).
|
||
>>> paddle.seed(200)
|
||
>>> out4 = paddle.rand(2, 3)
|
||
>>> print(out4)
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.77663314, 0.90824795, 0.15685187],
|
||
[0.04279523, 0.34468332, 0.79557180]])
|
||
"""
|
||
device = (
|
||
_get_paddle_place(device)
|
||
if device is not None
|
||
else _current_expected_place()
|
||
)
|
||
if pin_memory and in_dynamic_mode() and device is not None:
|
||
device = _to_pinned_place(device)
|
||
tensor = uniform(
|
||
shape=shape,
|
||
dtype=dtype,
|
||
min=0.0,
|
||
max=1.0,
|
||
name=name,
|
||
out=out,
|
||
device=device,
|
||
requires_grad=requires_grad,
|
||
)
|
||
if pin_memory and in_dynamic_mode():
|
||
tensor = tensor.pin_memory()
|
||
return tensor
|
||
|
||
|
||
@param_one_alias(["lam", "lambd"])
|
||
def exponential_(
|
||
x: Tensor, lam: float = 1.0, name: str | None = None
|
||
) -> Tensor:
|
||
r"""
|
||
This inplace OP fill input Tensor ``x`` with random number from a Exponential Distribution.
|
||
|
||
``lam`` is :math:`\lambda` parameter of Exponential Distribution.
|
||
|
||
.. math::
|
||
|
||
f(x) = \lambda e^{-\lambda x}
|
||
|
||
Args:
|
||
x(Tensor): Input tensor. The data type should be float32, float64.
|
||
lam(float, optional): :math:`\lambda` parameter of Exponential Distribution. Default: 1.0.
|
||
Alias: ``lambd``.
|
||
name(str|None, optional): The default value is None. Normally there is no
|
||
need for user to set this property. For more information, please
|
||
refer to :ref:`api_guide_Name`.
|
||
Returns:
|
||
Tensor, Input Tensor ``x``.
|
||
|
||
Examples:
|
||
.. code-block:: pycon
|
||
|
||
>>> import paddle
|
||
>>> paddle.set_device('cpu')
|
||
>>> paddle.seed(100)
|
||
|
||
>>> x = paddle.empty([2, 3])
|
||
>>> x.exponential_()
|
||
>>> # doctest: +SKIP("Random output")
|
||
Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
|
||
[[0.80643415, 0.23211166, 0.01169797],
|
||
[0.72520679, 0.45208144, 0.30234432]])
|
||
>>> # doctest: -SKIP
|
||
|
||
"""
|
||
if in_dynamic_or_pir_mode():
|
||
return _C_ops.exponential_(x, lam)
|
||
else:
|
||
check_variable_and_dtype(
|
||
x, "x", ["float16", "float32", "float64", "uint16"], "exponential"
|
||
)
|
||
|
||
helper = LayerHelper("exponential", **locals())
|
||
helper.append_op(
|
||
type='exponential',
|
||
inputs={"X": x},
|
||
outputs={'Out': x},
|
||
attrs={"lambda": lam},
|
||
)
|
||
return x
|