random.py 12.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#   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  
S
silingtong123 已提交
16

G
guofei 已提交
17 18
import numpy as np

C
cc 已提交
19
from ..fluid import core
G
guofei 已提交
20
from ..fluid.framework import device_guard, in_dygraph_mode, _varbase_creator, Variable, convert_np_dtype_to_dtype_
C
cc 已提交
21 22 23
from ..fluid.layers.layer_function_generator import templatedoc
from ..fluid.layer_helper import LayerHelper
from ..fluid.data_feeder import convert_dtype, check_variable_and_dtype, check_type, check_dtype
24
from ..fluid.layers import utils, uniform_random, gaussian_random
S
silingtong123 已提交
25 26
from ..fluid.layers.tensor import fill_constant

27 28 29 30 31 32 33 34 35 36 37
from ..fluid.io import shuffle  #DEFINE_ALIAS

__all__ = [
    #       'gaussin',
    #       'uniform',
    'shuffle',
    'randn',
    'rand',
    'randint',
    'randperm'
]
S
silingtong123 已提交
38 39


40
def randint(low=0, high=None, shape=[1], dtype=None, name=None):
S
silingtong123 已提交
41
    """
42
	:alias_main: paddle.randint
43
	:alias: paddle.tensor.randint, paddle.tensor.random.randint
S
swtkiwi 已提交
44

45 46 47
    This OP 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``).
S
silingtong123 已提交
48 49

    Args:
50 51 52 53 54 55 56 57 58 59 60 61 62 63
        low(int): 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(list|tuple|Tensor): The shape of the output Tensor. If ``shape``
            is a list or tuple, the elements of it should be integers or Tensors
            (with the shape [1], and the data type int32 or int64). If ``shape``
            is a Tensor, it should be a 1-D Tensor(with the data type int32 or
            int64). Default is [1].
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: int32, int64. If ``dytpe``
            is None, the data type is int64. Default is None.
64 65 66
        name(str, 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`.
S
silingtong123 已提交
67 68

    Returns: 
69 70
        Tensor: A Tensor filled with random integers from a discrete uniform
        distribution in the range [``low``, ``high``), with ``shape`` and ``dtype``.
S
silingtong123 已提交
71 72

    Raises:
73 74 75 76
        TypeError: If ``shape`` is not list, tuple, Tensor.
        TypeError: If ``dtype`` is not int32, int64.
        ValueError: If ``high`` is not greater then ``low``; If ``high`` is 
            None, and ``low`` is not greater than 0.
S
silingtong123 已提交
77 78 79

    Examples:
        .. code-block:: python
80

81 82 83
        import paddle
        import numpy as np

84
        paddle.disable_static()
85 86

        # example 1:
87
        # attr shape is a list which doesn't contain Tensor.
88
        result_1 = paddle.randint(low=-5, high=5, shape=[3])
89
        # [0, -3, 2]
90 91

        # example 2:
92 93 94
        # attr shape is a list which contains Tensor.
        dim_1 = paddle.fill_constant([1], "int64", 2)
        dim_2 = paddle.fill_constant([1], "int32", 3)
95
        result_2 = paddle.randint(low=-5, high=5, shape=[dim_1, dim_2], dtype="int32")
96 97
        # [[0, -1, -3],
        #  [4, -2,  0]]
98 99

        # example 3:
100
        # attr shape is a Tensor
101
        var_shape = paddle.to_variable(np.array([3]))
102
        result_3 = paddle.randint(low=-5, high=5, shape=var_shape)
103
        # [-2, 2, 3]
104 105 106 107

        # example 4:
        # data type is int32
        result_4 = paddle.randint(low=-5, high=5, shape=[3], dtype='int32')
108
        # [-5, 4, -4]
109 110 111 112 113 114

        # example 5:
        # Input only one parameter
        # low=0, high=10, shape=[1], dtype='int64'
        result_5 = paddle.randint(10)
        # [7]
S
silingtong123 已提交
115

116 117
    """
    if high is None:
118 119 120 121
        if low <= 0:
            raise ValueError(
                "If high is None, low must be greater than 0, but received low = {0}.".
                format(low))
122 123
        high = low
        low = 0
S
silingtong123 已提交
124 125
    if dtype is None:
        dtype = 'int64'
126 127
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
S
silingtong123 已提交
128 129

    if in_dygraph_mode():
130 131 132
        shape = utils._convert_shape_to_list(shape)
        return core.ops.randint('shape', shape, 'low', low, 'high', high,
                                'seed', 0, 'dtype', dtype)
S
silingtong123 已提交
133

134 135 136
    check_type(shape, 'shape', (list, tuple, Variable), 'randint')
    check_dtype(dtype, 'dtype', ['int32', 'int64'], 'randint')
    if low >= high:
S
silingtong123 已提交
137 138 139 140
        raise ValueError(
            "randint's low must less then high, but received low = {0}, "
            "high = {1}".format(low, high))

141 142 143 144 145 146 147 148 149
    inputs = dict()
    attrs = {'low': low, 'high': high, 'seed': 0, 'dtype': dtype}
    utils._get_shape_tensor_inputs(
        inputs=inputs, attrs=attrs, shape=shape, op_type='randint')

    helper = LayerHelper("randint", **locals())
    out = helper.create_variable_for_type_inference(dtype=dtype)
    helper.append_op(
        type='randint', inputs=inputs, outputs={'Out': out}, attrs=attrs)
S
silingtong123 已提交
150
    return out
C
cc 已提交
151 152


153
def randn(shape, dtype=None, name=None):
G
guofei 已提交
154
    """
155
	:alias_main: paddle.randn
156
	:alias: paddle.tensor.randn, paddle.tensor.random.randn
S
swtkiwi 已提交
157

158 159 160
    This OP returns a Tensor filled with random values sampled from a normal
    distribution with mean 0 and standard deviation 1 (also called the standard
    normal distribution), with ``shape`` and ``dtype``.
G
guofei 已提交
161 162

    Args:
163 164 165 166 167 168 169 170 171 172 173
        shape(list|tuple|Tensor): The shape of the output Tensor. If ``shape``
            is a list or tuple, the elements of it should be integers or Tensors
            (with the shape [1], and the data type int32 or int64). If ``shape``
            is a Tensor, it should be a 1-D Tensor(with the data type int32 or
            int64).
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: float32, float64. If ``dytpe``
            is None, the data type is float32. Default is None.
        name(str, 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`.
G
guofei 已提交
174 175

    Returns:
176 177 178
        Tensor: A Tensor filled with random values sampled from a normal
        distribution with mean 0 and standard deviation 1 (also called the
        standard normal distribution), with ``shape`` and ``dtype``.
G
guofei 已提交
179 180

    Raises:
181 182
        TypeError: If ``shape`` is not list, tuple, Tensor.
        TypeError: If ``dtype`` is not float32, float64.
G
guofei 已提交
183 184 185 186

    Examples:
        .. code-block:: python

187 188
        import paddle
        import numpy as np
G
guofei 已提交
189

190
        paddle.disable_static()
G
guofei 已提交
191

192
        # example 1: attr shape is a list which doesn't contain Tensor.
193
        result_1 = paddle.randn(shape=[2, 3])
194 195
        # [[-2.923464  ,  0.11934398, -0.51249987],
        #  [ 0.39632758,  0.08177969,  0.2692008 ]]
G
guofei 已提交
196

197
        # example 2: attr shape is a list which contains Tensor.
198 199 200
        dim_1 = paddle.fill_constant([1], "int64", 2)
        dim_2 = paddle.fill_constant([1], "int32", 3)
        result_2 = paddle.randn(shape=[dim_1, dim_2, 2])
201 202 203 204 205 206 207 208
        # [[[-2.8852394 , -0.25898588],
        #   [-0.47420555,  0.17683524],
        #   [-0.7989969 ,  0.00754541]],
        #  [[ 0.85201347,  0.32320443],
        #   [ 1.1399018 ,  0.48336947],
        #   [ 0.8086993 ,  0.6868893 ]]]

        # example 3: attr shape is a Tensor, the data type must be int64 or int32.
209
        var_shape = paddle.to_variable(np.array([2, 3]))
210
        result_3 = paddle.randn(var_shape)
211 212
        # [[-2.878077 ,  0.17099959,  0.05111201]
        #  [-0.3761474, -1.044801  ,  1.1870178 ]]
G
guofei 已提交
213

214
    """
G
guofei 已提交
215 216 217
    if dtype is None:
        dtype = 'float32'

218 219 220
    out = gaussian_random(
        shape=shape, mean=0.0, std=1.0, seed=0, dtype=dtype, name=name)
    out.stop_gradient = True
G
guofei 已提交
221 222 223
    return out


C
cc 已提交
224
@templatedoc()
225
def randperm(n, dtype="int64", name=None):
C
cc 已提交
226
    """
227
	:alias_main: paddle.randperm
228
	:alias: paddle.tensor.randperm, paddle.tensor.random.randperm
S
swtkiwi 已提交
229

230 231
    This OP returns a 1-D Tensor filled with random permutation values from 0
    to n-1, with ``dtype``.
C
cc 已提交
232 233

    Args:
234
        n(int): The upper bound (exclusive), and it should be greater than 0.
235 236 237 238 239 240
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of
            the output Tensor. Supported data types: int32, int64, float32,
            float64. Default is int64.
        name(str, 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`.
C
cc 已提交
241 242

    Returns:
243 244
        Tensor: A 1-D Tensor filled with random permutation values from 0
        to n-1, with ``dtype``.
C
cc 已提交
245

246 247 248
    Raises:
        ValueError: If ``n`` is not greater than 0.
        TypeError: If ``dtype`` is not int32, int64, float32, float64.
C
cc 已提交
249 250 251 252

    Examples:
        .. code-block:: python

253
        import paddle
C
cc 已提交
254

255
        paddle.disable_static()
C
cc 已提交
256

257
        result_1 = paddle.randperm(5)
258
        # [4, 1, 2, 3, 0]
C
cc 已提交
259

260
        result_2 = paddle.randperm(7, 'int32')
261
        # [1, 6, 2, 0, 4, 3, 5]
C
cc 已提交
262 263
 
    """
264 265 266 267 268
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)

    if in_dygraph_mode():
        return core.ops.randperm('n', n, 'seed', 0, 'dtype', dtype)
C
cc 已提交
269 270 271

    if n < 1:
        raise ValueError("The input n should be greater than 0 in randperm op.")
272 273
    check_dtype(dtype, 'dtype', ['int64', 'int32', 'float32', 'float64'],
                'randperm')
C
cc 已提交
274 275

    helper = LayerHelper("randperm", **locals())
276 277 278 279
    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)
280
    out.stop_gradient = True
C
cc 已提交
281
    return out
X
Xing Wu 已提交
282 283


284
def rand(shape, dtype=None, name=None):
X
Xing Wu 已提交
285
    """
286
	:alias_main: paddle.rand
287
	:alias: paddle.tensor.rand, paddle.tensor.random.rand
S
swtkiwi 已提交
288

289 290
    This OP returns a Tensor filled with random values sampled from a uniform
    distribution in the range [0, 1), with ``shape`` and ``dtype``.
X
Xing Wu 已提交
291 292 293 294 295 296 297 298 299 300 301

    Examples:
    ::

        Input:
          shape = [1, 2]

        Output:
          result=[[0.8505902, 0.8397286]]

    Args:
302 303 304 305 306 307 308 309
        shape(list|tuple|Tensor): The shape of the output Tensor. If ``shape``
            is a list or tuple, the elements of it should be integers or Tensors
            (with the shape [1], and the data type int32 or int64). If ``shape``
            is a Tensor, it should be a 1-D Tensor(with the data type int32 or
            int64).
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: float32, float64. If ``dytpe``
            is None, the data type is float32. Default is None.
310 311 312
        name(str, 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`.
313

X
Xing Wu 已提交
314
    Returns:
315 316
        Tensor: A Tensor filled with random values sampled from a uniform
        distribution in the range [0, 1), with ``shape`` and ``dtype``.
X
Xing Wu 已提交
317 318

    Raises:
319 320
        TypeError: If ``shape`` is not list, tuple, Tensor.
        ValueError: If ``dtype`` is not float32, float64.
X
Xing Wu 已提交
321 322 323 324

    Examples:
        .. code-block:: python

325 326 327
        import paddle
        import numpy as np

328
        paddle.disable_static()
329
        # example 1: attr shape is a list which doesn't contain Tensor.
330 331 332 333
        result_1 = paddle.rand(shape=[2, 3])
        # [[0.451152  , 0.55825245, 0.403311  ],
        #  [0.22550228, 0.22106001, 0.7877319 ]]

334
        # example 2: attr shape is a list which contains Tensor.
335 336 337
        dim_1 = paddle.fill_constant([1], "int64", 2)
        dim_2 = paddle.fill_constant([1], "int32", 3)
        result_2 = paddle.rand(shape=[dim_1, dim_2, 2])
338 339 340 341 342 343 344 345
        # [[[0.8879919 , 0.25788337],
        #   [0.28826773, 0.9712097 ],
        #   [0.26438272, 0.01796806]],
        #  [[0.33633623, 0.28654453],
        #   [0.79109055, 0.7305809 ],
        #   [0.870881  , 0.2984597 ]]]

        # example 3: attr shape is a Tensor, the data type must be int64 or int32.
346
        var_shape = paddle.to_variable(np.array([2, 3]))
347
        result_3 = paddle.rand(var_shape)
348 349
        # [[0.22920267, 0.841956  , 0.05981819],
        #  [0.4836288 , 0.24573246, 0.7516129 ]]
X
Xing Wu 已提交
350 351 352 353

    """
    if dtype is None:
        dtype = 'float32'
354 355 356 357

    out = uniform_random(shape, dtype, min=0.0, max=1.0, name=name)
    out.stop_gradient = True
    return out