tensor.py 63.5 KB
Newer Older
1
#   Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
D
dzhwinter 已提交
2
#
D
dzhwinter 已提交
3 4 5
# 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
D
dzhwinter 已提交
6
#
D
dzhwinter 已提交
7
#     http://www.apache.org/licenses/LICENSE-2.0
D
dzhwinter 已提交
8
#
Y
yuyang18 已提交
9
# Unlessf required by applicable law or agreed to in writing, software
D
dzhwinter 已提交
10 11 12 13 14
# 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.

15
from __future__ import print_function
16 17

import numpy
18
import six
19
import warnings
20
from six.moves import reduce
21

Y
Yu Yang 已提交
22
from ..layer_helper import LayerHelper
23
from ..param_attr import ParamAttr
24
from ..initializer import Initializer
25
from ..framework import convert_np_dtype_to_dtype_, in_dygraph_mode, _varbase_creator, device_guard
X
xuwei06 已提交
26
from ..framework import Variable
27
from ..initializer import Constant
28
from ..core import VarDesc
29
from .. import core
30
from .layer_function_generator import templatedoc
L
Leo Chen 已提交
31
from . import utils
32
from ..data_feeder import check_variable_and_dtype, check_type, check_dtype, convert_dtype
33
from paddle.utils import deprecated
34

35
from .utils import check_shape
Y
Yu Yang 已提交
36 37

__all__ = [
L
li099 已提交
38 39 40
    'create_tensor', 'create_parameter', 'create_global_var', 'cast',
    'tensor_array_to_tensor', 'concat', 'sums', 'assign',
    'fill_constant_batch_size_like', 'fill_constant', 'argmin', 'argmax',
Z
zhoukunsheng 已提交
41
    'argsort', 'ones', 'zeros', 'reverse', 'has_inf', 'has_nan', 'isfinite',
Y
yaoxuefeng 已提交
42
    'range', 'linspace', 'zeros_like', 'ones_like', 'diag', 'eye', 'triu'
Y
Yu Yang 已提交
43 44 45
]


X
xuwei06 已提交
46
def create_tensor(dtype, name=None, persistable=False):
47
    """
W
wangchaochaohu 已提交
48
    Create a variable, which will hold a Tensor with data type dtype.
49 50

    Args:
W
wangchaochaohu 已提交
51 52 53 54
        dtype(string|numpy.dtype): the data type of Tensor to be created, the
            data type is bool, float16, float32, float64, int8, int16, int32 and int64.
        name(string, 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`
Q
update  
qiaolongfei 已提交
55
        persistable(bool): Set the persistable flag of the create tensor.
W
wangchaochaohu 已提交
56
            default value is False.
57 58

    Returns:
W
wangchaochaohu 已提交
59
        Variable: The tensor to be created according to dtype.
60 61 62 63

    Examples:
        .. code-block:: python

64
          import paddle.fluid as fluid
65 66
          tensor = fluid.layers.create_tensor(dtype='float32')
    """
67 68 69 70
    check_dtype(dtype, 'dtype', [
        'bool', 'float16', 'float32', 'float64', 'int8', 'int32', 'int32',
        'int64'
    ], 'create_tensor')
Y
Yu Yang 已提交
71
    helper = LayerHelper("create_tensor", **locals())
X
xuwei06 已提交
72 73
    return helper.create_variable(
        name=helper.name, dtype=dtype, persistable=persistable)
Y
Yu Yang 已提交
74 75


76 77
def create_parameter(shape,
                     dtype,
X
xuwei06 已提交
78
                     name=None,
79 80 81 82
                     attr=None,
                     is_bias=False,
                     default_initializer=None):
    """
83
	:api_attr: Static Graph
S
swtkiwi 已提交
84

85
    This function creates a parameter. The parameter is a learnable variable, which can have
Y
yuyang18 已提交
86 87 88 89 90
    gradient, and can be optimized.

    NOTE: this is a very low-level API. This API is useful when you create
    operator by your self. instead of using layers.

91 92 93 94 95 96 97
    Parameters:
        shape (list of int): Shape of the parameter
        dtype (str): Data type of the parameter
        name (str, optional): For detailed information, please refer to
           :ref:`api_guide_Name` . Usually name is no need to set and None by default.
        attr (ParamAttr, optional): Attributes of the parameter
        is_bias (bool, optional): This can affect which default initializer is chosen
98 99 100
                       when default_initializer is None. If is_bias,
                       initializer.Constant(0.0) will be used. Otherwise,
                       Xavier() will be used.
101
        default_initializer (Initializer, optional): Initializer for the parameter
102 103

    Returns:
104
        The created parameter.
Y
yuyang18 已提交
105 106

    Examples:
107 108
        .. code-block:: python

109 110 111
            import paddle
            paddle.enable_static()
            W = paddle.static.create_parameter(shape=[784, 200], dtype='float32')
112
    """
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    check_type(shape, 'shape', (list, tuple, numpy.ndarray), 'create_parameter')
    for item in shape:
        if six.PY2:
            check_type(item, 'item of shape',
                       (int, long, numpy.uint8, numpy.int8, numpy.int16,
                        numpy.int32, numpy.int64), 'create_parameter')
        else:
            check_type(item, 'item of shape',
                       (int, numpy.uint8, numpy.int8, numpy.int16, numpy.int32,
                        numpy.int64), 'create_parameter')

    check_dtype(dtype, 'dtype', [
        'bool', 'float16', 'float32', 'float64', 'int8', 'int16', 'int32',
        'int64', 'uint8'
    ], 'create_parameter')
    check_type(attr, 'attr', (type(None), ParamAttr), 'create_parameter')
    check_type(default_initializer, 'default_initializer',
               (type(None), Initializer), 'create_parameter')

Q
Qiao Longfei 已提交
132
    helper = LayerHelper("create_parameter", **locals())
133
    if attr is None:
X
xuwei06 已提交
134
        attr = ParamAttr(name=name)
135 136
    return helper.create_parameter(attr, shape,
                                   convert_dtype(dtype), is_bias,
137 138 139
                                   default_initializer)


140 141 142 143 144 145 146
def create_global_var(shape,
                      value,
                      dtype,
                      persistable=False,
                      force_cpu=False,
                      name=None):
    """
147
    This function creates a new tensor variable with value in the global block(block 0).
F
fengjiayi 已提交
148

149 150 151
    Parameters:
        shape (list of int): Shape of the variable
        value (float): The value of the variable. The new created
F
fengjiayi 已提交
152
                      variable will be filled with it.
153 154
        dtype (str): Data type of the variable
        persistable (bool, optional): If this variable is persistable.
F
fengjiayi 已提交
155
                           Default: False
156
        force_cpu (bool, optional): Force this variable to be on CPU.
F
fengjiayi 已提交
157
                         Default: False
158 159
        name (str, optional): For detailed information, please refer to
           :ref:`api_guide_Name` . Usually name is no need to set and None by default.
160 161

    Returns:
162
        Variable: The created Variable
F
fengjiayi 已提交
163 164 165 166

    Examples:
        .. code-block:: python

167 168 169
            import paddle
            paddle.enable_static()
            var = paddle.static.create_global_var(shape=[2,3], value=1.0, dtype='float32',
170
                                           persistable=True, force_cpu=True, name='new_var')
171
    """
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
    check_type(shape, 'shape', (list, tuple, numpy.ndarray),
               'create_global_var')
    for item in shape:
        if six.PY2:
            check_type(item, 'item of shape',
                       (int, long, numpy.uint8, numpy.int8, numpy.int16,
                        numpy.int32, numpy.int64), 'create_global_var')
        else:
            check_type(item, 'item of shape',
                       (int, numpy.uint8, numpy.int8, numpy.int16, numpy.int32,
                        numpy.int64), 'create_global_var')

    check_dtype(dtype, 'dtype', [
        'bool', 'float16', 'float32', 'float64', 'int8', 'int16', 'int32',
        'int64', 'uint8'
    ], 'create_global_var')

Q
Qiao Longfei 已提交
189 190
    helper = LayerHelper("global_var", **locals())
    var = helper.create_global_variable(
M
minqiyang 已提交
191 192 193 194 195
        dtype=dtype,
        shape=shape,
        persistable=persistable,
        name=name,
        stop_gradient=True)
M
minqiyang 已提交
196 197 198
    helper.set_variable_initializer(
        var, initializer=Constant(
            value=float(value), force_cpu=force_cpu))
M
minqiyang 已提交
199

Q
Qiao Longfei 已提交
200 201 202
    return var


203
def cast(x, dtype):
Y
Yu Yang 已提交
204
    """
S
swtkiwi 已提交
205

206 207 208
    This OP takes in the Variable :attr:`x` with :attr:`x.dtype` and casts it
    to the output with :attr:`dtype`. It's meaningless if the output dtype
    equals the input dtype, but it's fine if you do so.
Y
Yibing Liu 已提交
209 210

    Args:
211
        x(Tensor): An input N-D Tensor with data type bool, float16,
212 213
            float32, float64, int32, int64, uint8.
        dtype(np.dtype|core.VarDesc.VarType|str): Data type of the output:
214
            bool, float16, float32, float64, int8, int32, int64, uint8.
Y
Yibing Liu 已提交
215 216

    Returns:
217
        Tensor: A Tensor with the same shape as input's.
Y
Yibing Liu 已提交
218 219 220

    Examples:
        .. code-block:: python
F
fengjiayi 已提交
221

222
            import paddle
223

224 225
            x = paddle.to_tensor([2, 3, 4], 'float64')
            y = paddle.cast(x, 'uint8')
Y
Yu Yang 已提交
226
    """
227 228
    check_variable_and_dtype(
        x, 'x',
229 230
        ['bool', 'float16', 'float32', 'float64', 'int32', 'int64', 'uint8'],
        'cast')
231 232 233 234 235 236
    check_dtype(dtype, 'dtype', [
        'bool', 'float16', 'float32', 'float64', 'int8', 'int32', 'int64',
        'uint8'
    ], 'cast')

    helper = LayerHelper('cast', **locals())
X
Xin Pan 已提交
237
    out = helper.create_variable_for_type_inference(dtype=dtype)
Y
Yu Yang 已提交
238 239 240 241 242 243 244 245 246
    helper.append_op(
        type='cast',
        inputs={'X': [x]},
        outputs={'Out': [out]},
        attrs={'in_dtype': x.dtype,
               'out_dtype': out.dtype})
    return out


247
def concat(input, axis=0, name=None):
Y
Yu Yang 已提交
248
    """
249
    This OP concatenates the input along the axis.
250 251

    Args:
252 253
        input(list|tuple|Tensor): ``input`` can be Tensor, Tensor list or Tensor tuple which is with data type
            bool, float16, float32, float64, int32, int64. All the Tensors in ``input`` must have the same data type. 
254 255
        axis(int|Tensor, optional): Specify the axis to operate on the input Tensors.
            It's a scalar with data type int or a Tensor with shape [1] and data type int32 or int64.
256
            The effective range is [-R, R), where R is Rank(x). When ``axis < 0``, it works the same way
257
            as ``axis+R``. Default is 0.
258 259 260
        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`.
261 262

    Returns:
263
        Tensor: A Tensor with the same data type as ``input``.
264 265 266

    Examples:
        .. code-block:: python
F
fengjiayi 已提交
267

268
            import paddle.fluid as fluid
269 270
            import numpy as np

271 272 273 274 275 276
            in1 = np.array([[1, 2, 3],
                            [4, 5, 6]])
            in2 = np.array([[11, 12, 13],
                            [14, 15, 16]])
            in3 = np.array([[21, 22],
                            [23, 24]])
277 278 279 280
            with fluid.dygraph.guard():
                x1 = fluid.dygraph.to_variable(in1)
                x2 = fluid.dygraph.to_variable(in2)
                x3 = fluid.dygraph.to_variable(in3)
281 282
                # When the axis is negative, the real axis is (axis + Rank(x)).
                # As follows, axis is -1, Rank(x) is 2, the real axis is 1
283 284
                out1 = fluid.layers.concat(input=[x1, x2, x3], axis=-1)
                out2 = fluid.layers.concat(input=[x1, x2], axis=0)
285 286 287 288 289 290 291 292
                print(out1.numpy())
                # [[ 1  2  3 11 12 13 21 22]
                #  [ 4  5  6 14 15 16 23 24]]
                print(out2.numpy())
                # [[ 1  2  3]
                #  [ 4  5  6]
                #  [11 12 13]
                #  [14 15 16]]
Y
Yu Yang 已提交
293
    """
294 295

    if in_dygraph_mode():
S
songyouwei 已提交
296 297
        if isinstance(axis, Variable):
            axis = axis.numpy()
298
            axis = axis.item(0)
299
        return core.ops.concat(input, 'axis', axis)
300

301 302 303 304 305 306 307 308 309 310 311
    check_type(input, 'input', (list, tuple, Variable), 'concat')
    if not isinstance(input, Variable):
        for id, x in enumerate(input):
            check_variable_and_dtype(
                x, 'input[' + str(id) + ']',
                ['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
                'concat')
            if x.dtype != input[0].dtype:
                raise TypeError(
                    "All the Tensors in the input must have the same data type.")
    else:
312
        input = [input]
313
    check_type(axis, 'axis', (int, Variable), 'concat')
314

315 316 317 318 319
    if isinstance(axis, Variable):
        check_dtype(
            axis.dtype, 'axis', ['int32', 'int64'], 'concat',
            "The data type of axis must be int32 or int64 when axis is a Tensor")

320
    helper = LayerHelper('concat', **locals())
X
Xin Pan 已提交
321
    out = helper.create_variable_for_type_inference(dtype=helper.input_dtype())
322 323 324

    if input[0].desc.type() == core.VarDesc.VarType.LOD_TENSOR_ARRAY:
        assert len(input) == 1, "If the elements of 'input' in concat are Variable(LoDTensorArray), " \
325
                "number of the elements must be 1, but received %s." % len(input)
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
        out_index = helper.create_variable_for_type_inference(dtype="int32")
        helper.append_op(
            type='tensor_array_to_tensor',
            inputs={'X': input[0]},
            outputs={'Out': [out],
                     'OutIndex': [out_index]},
            attrs={'axis': axis,
                   'use_stack': False})
    else:
        inputs = {'X': input}
        attrs = {}
        if isinstance(axis, Variable):
            axis.stop_gradient = True
            inputs['AxisTensor'] = axis
        else:
            attrs['axis'] = axis

        helper.append_op(
            type='concat', inputs=inputs, outputs={'Out': [out]}, attrs=attrs)
Y
Yu Yang 已提交
345 346 347
    return out


G
Guo Sheng 已提交
348
def tensor_array_to_tensor(input, axis=1, name=None, use_stack=False):
349
    r"""
G
Guo Sheng 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
    This function concatenates or stacks all tensors in the input LoDTensorArray
    along the axis mentioned and returns that as the output.

    For Example:

    .. code-block:: text

        Case 1:

            Given:

                input.data = {[[0.6, 0.1, 0.3],
                               [0.5, 0.3, 0.2]],
                              [[1.3],
                               [1.8]],
                              [[2.3, 2.1],
                               [2.5, 2.4]]}

                axis = 1, use_stack = False

            Then:

                output.data = [[0.6, 0.1, 0.3, 1.3, 2.3, 2.1],
                               [0.5, 0.3, 0.2, 1.8, 2.5, 2.4]]

                output_index.data = [3, 1, 2]

        Case 2:

            Given:

                input.data = {[[0.6, 0.1],
                               [0.5, 0.3]],
                              [[0.3, 1.3],
                               [0.2, 1.8]],
                              [[2.3, 2.1],
                               [2.5, 2.4]]}

                axis = 1, use_stack = True

            Then:

                output.data = [[[0.6, 0.1]
                                [0.3, 1.3]
                                [2.3, 2.1],
                               [[0.5, 0.3]
                                [0.2, 1.8]
                                [2.5, 2.4]]]

                output_index.data = [2, 2, 2]
L
li099 已提交
400 401

    Args:
G
Guo Sheng 已提交
402 403 404 405 406 407 408
        input(Variable): A LodTensorArray variable.
        axis(int): The axis along which the tensors in attr::`input` will be
            concatenated or stacked.
        name(str|None): A name for this layer(optional). If set None, the layer
                       will be named automatically.
        use_stack(bool): Act as concat_op or stack_op. For stack mode, all
            tensors in the tensor array must have the same shape.
L
li099 已提交
409 410

    Returns:
G
Guo Sheng 已提交
411 412 413
        Variable: The concatenated or stacked tensor variable.
        Variable: A 1-D tensor variable with int32 data type. The data in this \
            tensor contains all input including tensors' sizes along the axis.
L
li099 已提交
414 415 416 417

    Examples:
        .. code-block:: python

418
            import paddle.fluid as fluid
419
            import numpy as np
G
Guo Sheng 已提交
420 421 422 423 424 425 426
            x0 = fluid.layers.assign(np.random.rand(2, 2).astype("float32"))
            x1 = fluid.layers.assign(np.random.rand(2, 2).astype("float32"))
            i = fluid.layers.fill_constant(shape=[1], dtype="int64", value=0)
            array = fluid.layers.create_array(dtype='float32')
            fluid.layers.array_write(x0, i, array)
            fluid.layers.array_write(x1, i + 1, array)
            output, output_index = fluid.layers.tensor_array_to_tensor(input=array)
L
li099 已提交
427
    """
428 429 430 431 432 433 434 435 436 437 438
    if in_dygraph_mode():
        assert isinstance(
            input, list), "The 'input' in tensor_array_to_tensor must be list"
        from .nn import stack, concat
        from ..dygraph import to_variable
        op = stack if use_stack else concat
        res = op(input, axis=axis)
        sizes = to_variable(
            numpy.array(list(map(lambda x: int(x.shape[axis]), input))))
        return res, sizes

439 440 441 442 443
    check_type(input, 'input', (list, Variable), 'tensor_array_to_tensor')
    if isinstance(input, list):
        for i, input_x in enumerate(input):
            check_type(input_x, 'input[' + str(i) + ']', Variable,
                       'tensor_array_to_tensor')
L
li099 已提交
444
    helper = LayerHelper('tensor_array_to_tensor', **locals())
L
li099 已提交
445 446 447
    out = helper.create_variable_for_type_inference(dtype=helper.input_dtype())
    out_index = helper.create_variable_for_type_inference(dtype="int32")
    helper.append_op(
L
li099 已提交
448
        type='tensor_array_to_tensor',
L
li099 已提交
449 450 451
        inputs={'X': input},
        outputs={'Out': [out],
                 'OutIndex': [out_index]},
G
Guo Sheng 已提交
452 453
        attrs={'axis': axis,
               'use_stack': use_stack})
L
li099 已提交
454 455 456
    return out, out_index


457
def sums(input, out=None):
458
    r"""
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479
    This function computes the sum of multiple input Tensors elementwisely.

    - Case 1, sum of 3 Tensors

    .. code-block:: text

        # Input Tensors
        x0.shape = [2, 3]
        x0.data = [[1., 2., 3.],
                   [4., 5., 6.]]
        x1.shape = [2, 3]
        x1.data = [[10., 20., 30.],
                   [40., 50., 60.]]
        x2.shape = [2, 3]
        x2.data = [[100., 200., 300.],
                   [400., 500., 600.]]

        # Output Tensor
        out.shape = [2, 3]
        out.data = [[111., 222., 333.],
                    [444., 555., 666.]]
K
kavyasrinet 已提交
480 481

    Args:
482 483 484 485
        input (list): A list of Variables which hold input Tensors with the same
            data type and shape. Optional data types are: float32, float64, int32, int64.
        out (Variable, optional): Output Tensor. It can be any existing Variable.
            The default value is None, then a new Variable will be created and returned.
K
kavyasrinet 已提交
486 487

    Returns:
488 489
        Variable: The sum of inputs. The shape and data type is the same with input. \
            If :code:`out` is not None, the returned value is :code:`out` .
K
kavyasrinet 已提交
490 491

    Examples:
F
fengjiayi 已提交
492
        .. code-block:: python
K
kavyasrinet 已提交
493

494 495 496 497 498 499 500 501 502
            import paddle.fluid as fluid

            x0 = fluid.layers.fill_constant(shape=[16, 32], dtype='int64', value=1)
            x1 = fluid.layers.fill_constant(shape=[16, 32], dtype='int64', value=2)
            x2 = fluid.layers.fill_constant(shape=[16, 32], dtype='int64', value=3)
            x3 = fluid.layers.fill_constant(shape=[16, 32], dtype='int64', value=0)

            # Sum of multiple Tensors, the result is stored to a new Variable sum0 (sum0=x0+x1+x2, the value is [[6, ..., 6], ..., [6, ..., 6]])
            sum0 = fluid.layers.sums(input=[x0, x1, x2])
503

504 505
            # Sum of multiple Tensors, sum1 and x3 represents the same Variable (x3=x0+x1+x2, the value is [[6, ..., 6], ..., [6, ..., 6]])
            sum1 = fluid.layers.sums(input=[x0, x1, x2], out=x3)
Y
Yu Yang 已提交
506
    """
507 508 509 510 511 512 513 514 515
    check_type(input, 'input', (Variable, tuple, list), 'sums')
    if isinstance(input, list) or isinstance(input, tuple):
        for input_section in input:
            check_variable_and_dtype(input_section, "input", \
                    ['float32', 'float64', 'int32', 'int64'], 'sums')
    else:
        check_variable_and_dtype(input, "input", \
                ['float32', 'float64', 'int32', 'int64'], 'sums')

Y
Yu Yang 已提交
516 517
    helper = LayerHelper('sum', **locals())
    if out is None:
X
Xin Pan 已提交
518 519
        out = helper.create_variable_for_type_inference(
            dtype=helper.input_dtype())
520 521 522 523
    else:
        check_variable_and_dtype(
            out, "out", ['float32', 'float64', 'int32', 'int64'], 'sums')

T
tensor-tang 已提交
524 525 526 527 528
    helper.append_op(
        type='sum',
        inputs={'X': input},
        outputs={'Out': out},
        attrs={'use_mkldnn': False})
Y
Yu Yang 已提交
529 530 531
    return out


F
fengjiayi 已提交
532
def assign(input, output=None):
533
    """
S
swtkiwi 已提交
534

535
    The OP copies the :attr:`input` to the :attr:`output`.
536

537 538
    Parameters:
        input (Variable|numpy.ndarray): A tensor or numpy ndarray, its data type supports
539
            float16, float32, float64, int32 and int64.
540 541
        output (Variable, optional): A tensor. If :attr:`output` is None, a new tensor will
            be created as :attr:`output`. Default: None.
542 543

    Returns:
544
        Variable: A tensor with the same shape, data type and value as :attr:`input`.
545 546 547

    Examples:
        .. code-block:: python
548

549
          import paddle
550
          import numpy as np
551 552 553 554 555 556 557 558
          data = paddle.fill_constant(shape=[3, 2], value=2.5, dtype='float64') # [[2.5, 2.5], [2.5, 2.5], [2.5, 2.5]]
          array = np.array([[1, 1],
                            [3, 4],
                            [1, 3]]).astype(np.int64)
          result1 = paddle.zeros(shape=[3, 3], dtype='float32')
          paddle.nn.functional.assign(array, result1) # result1 = [[1, 1], [3 4], [1, 3]]
          result2 = paddle.nn.functional.assign(data)  # result2 = [[2.5, 2.5], [2.5, 2.5], [2.5, 2.5]]
          result3 = paddle.nn.functional.assign(np.array([[2.5, 2.5], [2.5, 2.5], [2.5, 2.5]], dtype='float32')) # result3 = [[2.5, 2.5], [2.5, 2.5], [2.5, 2.5]]
559
    """
Y
Yu Yang 已提交
560
    helper = LayerHelper('assign', **locals())
561
    check_type(input, 'input', (Variable, numpy.ndarray), 'assign')
562 563
    is_inplace = True if output is not None else False

X
xuwei06 已提交
564
    if isinstance(input, Variable):
565 566 567 568
        check_dtype(
            input.dtype, 'input',
            ['float16', 'float32', 'float64', 'int32', 'int64', 'bool'],
            'assign', '(When the type of input in assign is Variable.)')
569 570 571
        if output is None:
            output = helper.create_variable_for_type_inference(
                dtype=input.dtype)
X
xuwei06 已提交
572
        helper.append_op(
R
robot 已提交
573
            type='assign', inputs={'X': [input]}, outputs={'Out': [output]})
X
xuwei06 已提交
574 575
    elif isinstance(input, numpy.ndarray):
        dtype = convert_np_dtype_to_dtype_(input.dtype)
576 577 578 579
        if dtype == VarDesc.VarType.BOOL:
            value_name = "bool_values"
            values = [bool(v) for v in input.flat]
        elif dtype == VarDesc.VarType.FP32:
X
xuwei06 已提交
580
            value_name = "fp32_values"
581
            values = [float(v) for v in input.flat]
582
        elif dtype == VarDesc.VarType.INT32:
X
xuwei06 已提交
583
            value_name = "int32_values"
584
            values = [int(v) for v in input.flat]
585 586 587
        elif dtype == VarDesc.VarType.INT64:
            value_name = "int64_values"
            values = [int(v) for v in input.flat]
X
xuwei06 已提交
588
        else:
589 590
            raise TypeError(
                "When the type of 'input' in assign is numpy.ndarray, "
591
                "the data type of 'input' must be bool, float32, int32 or int64, but "
592
                "received %s." % convert_dtype(dtype))
593 594 595
        if input.size > 1024 * 1024:
            raise ValueError("The size of input is too big. Please consider "
                             "saving it to file and 'load_op' to load it")
596 597 598
        if output is None:
            output = helper.create_variable_for_type_inference(
                dtype=input.dtype)
X
xuwei06 已提交
599 600 601 602 603 604
        helper.append_op(
            type='assign_value',
            outputs={'Out': [output]},
            attrs={
                'dtype': dtype,
                'shape': list(input.shape),
605
                value_name: values
X
xuwei06 已提交
606 607
            })

608 609 610
    if is_inplace and in_dygraph_mode():
        output._bump_inplace_version()

Y
Yu Yang 已提交
611 612 613
    return output


614
def fill_constant(shape, dtype, value, force_cpu=False, out=None, name=None):
Y
Yu Yang 已提交
615
    """
S
swtkiwi 已提交
616

W
wangchaochaohu 已提交
617
    This OP creates a Tensor with specified `shape` and `dtype`, and
T
tianshuo78520a 已提交
618
    initializes it with a constant specified by `value`.
K
kavyasrinet 已提交
619

T
tianshuo78520a 已提交
620
    The attribute `stop_gradient` of the created Tensor is set to True.
621 622

    Args:
623 624 625
        shape(list|tuple|Tensor): Shape of the output Tensor, the data type of ``shape`` is int32 or int64.
            If ``shape`` is a list or tuple, the elements of it should be integers or Tensors with shape [1].
            If ``shape`` is an Tensor, it should be an 1-D Tensor with date type int32 or int64.
W
wangchaochaohu 已提交
626
        dtype(np.dtype|str): Data type of the output Tensor which can
W
wangchaochaohu 已提交
627
            be float16, float32, float64, int32, int64.
628 629 630 631 632 633
        value(bool|float|int|Tensor): The constant value used to initialize 
            the Tensor to be created. If ``value`` is an Tensor, it should be an 1-D Tensor.
        force_cpu(bool, optional): data should be on CPU if it's true, default value is False.
        out(Tensor, optional): Optional output which can be any created 
            Tensor that meets the requirements to store the result of operation.
            if ``out`` is None, a new Tensor will be create to store the result.
634 635
        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`.
636 637

    Returns:
638
        Tensor: Tensor which is created according to shape and dtype.
W
wangchaochaohu 已提交
639

640 641 642
    Examples:
        .. code-block:: python

643
          import paddle.fluid as fluid
644
          # attr shape is a list which doesn't contain  Tensor.
645 646
          data1 = fluid.layers.fill_constant(shape=[2,1], value=0, dtype='int64') # data1=[[0],[0]]
          data2 = fluid.layers.fill_constant(shape=[2,1], value=5, dtype='int64', out=data1)
647
          # data1=[[5], [5]] data2=[[5], [5]]
648

649
          # attr shape is a list which contains Tensor.
650
          positive_2 = fluid.layers.fill_constant([1], "int32", 2)
651
          data3 = fluid.layers.fill_constant(shape=[1, positive_2], dtype='float32', value=1.5) # data3=[[1.5, 1.5]]
652

653
          # attr shape is a Tensor.
654
          shape = fluid.layers.fill_constant([2], "int32", 2) # shape=[2,2]
655
          data4 = fluid.layers.fill_constant(shape=shape, dtype='bool', value=True) # data4=[[True,True],[True,True]]
W
wangchaochaohu 已提交
656
          
657
          # attr value is a Tensor.
W
wangchaochaohu 已提交
658 659
          val = fluid.layers.fill_constant([1], "float32", 2.0) # val=[2.0]
          data5 = fluid.layers.fill_constant(shape=[2,1], value=val, dtype='float32') #data5=[[2.0],[2.0]]
Y
Yu Yang 已提交
660
    """
661

W
wangchaochaohu 已提交
662
    attrs = {'force_cpu': force_cpu}
663
    dtype = convert_dtype(dtype)
664
    if not isinstance(value, Variable):
665
        if dtype in ['int64', 'int32']:
W
wangchaochaohu 已提交
666
            attrs['str_value'] = str(int(value))
667
            attrs['value'] = int(value)
W
wangchaochaohu 已提交
668 669
        else:
            attrs['str_value'] = str(float(value))
670
            attrs['value'] = float(value)
671 672

    if in_dygraph_mode():
673
        shape = utils.convert_shape_to_list(shape)
674 675
        if out is None:
            out = _varbase_creator(dtype=dtype)
W
wangchaochaohu 已提交
676 677

        if isinstance(value, Variable):
678
            if dtype in ['int64', 'int32']:
679
                attrs['str_value'] = str(int(value.numpy().item(0)))
W
wangchaochaohu 已提交
680
            else:
681
                attrs['str_value'] = str(float(value.numpy().item(0)))
W
wangchaochaohu 已提交
682

683 684
        core.ops.fill_constant(out, 'value',
                               float(value), 'force_cpu', force_cpu, 'dtype',
685 686
                               out.dtype, 'str_value', attrs['str_value'],
                               'shape', shape)
687 688 689
        out.stop_gradient = True
        return out

690 691 692
    helper = LayerHelper("fill_constant", **locals())
    inputs = {}
    if isinstance(value, Variable):
693 694
        if convert_dtype(value.dtype) != dtype:
            value = cast(value, dtype)
695 696
        inputs['ValueTensor'] = value

697
    check_shape(shape)
698
    check_dtype(dtype, 'dtype',
699 700 701
                ['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
                'fill_constant')
    check_type(shape, 'shape', (Variable, list, tuple), 'fill_constant')
702

703 704 705 706 707
    if out is not None:
        check_variable_and_dtype(out, 'out', [convert_dtype(dtype)],
                                 'fill_constant')

    helper = LayerHelper("fill_constant", **locals())
708
    utils.get_shape_tensor_inputs(
709
        inputs=inputs, attrs=attrs, shape=shape, op_type='fill_constant')
L
liym27 已提交
710

Y
Yu Yang 已提交
711
    if out is None:
X
Xin Pan 已提交
712
        out = helper.create_variable_for_type_inference(dtype=dtype)
L
liym27 已提交
713
    attrs['dtype'] = out.dtype
Y
Yu Yang 已提交
714 715
    helper.append_op(
        type='fill_constant',
L
liym27 已提交
716
        inputs=inputs,
Y
Yu Yang 已提交
717
        outputs={'Out': [out]},
L
liym27 已提交
718
        attrs=attrs,
M
minqiyang 已提交
719
        stop_gradient=True)
Y
Yu Yang 已提交
720 721 722 723
    out.stop_gradient = True
    return out


724
@deprecated(since='1.8.0', update_to="paddle.fluid.layers.fill_constant")
Y
yuyang18 已提交
725
@templatedoc()
Y
Yu Yang 已提交
726 727 728 729 730
def fill_constant_batch_size_like(input,
                                  shape,
                                  dtype,
                                  value,
                                  input_dim_idx=0,
G
Guo Sheng 已提交
731 732
                                  output_dim_idx=0,
                                  force_cpu=False):
733
    """
T
tianshuo78520a 已提交
734
    This OP creates a Tesnor according the shape and dtype, and initializes the
W
wangchaochaohu 已提交
735 736 737 738
    Tensor with the constants provided in ``value``. When the input is LoDTensor
    and the input_dim_idx is 0, the output_dim_idx dimension is set to the value
    of the batch_size input by the input, the Stop_gradient attribute of the created
    Tensor is False by default.
739 740

    Args:
W
wangchaochaohu 已提交
741 742 743 744 745 746 747 748 749 750 751
        input(Variable): Tensor which data type is float32, float64, int32 and int64.
        shape(list): The shape of Tensor to be created, Tensor's shape may be changed
            according the input.
        dtype(np.dtype|core.VarDesc.VarType|str): The data type of created Tensor which
            can be float32, float64, int32, int64.
        value(float|int): The constant value used to initialize the Tensor to be created. 
        input_dim_idx(int): When the value is 0 and the input is LoDTensor, the output_dim_idx
            dimension of the created Tensor is set to the batch_size value of input.
            The default value is 0.
        output_dim_idx(int): Used to specify which dimension of Tensor is created to be set
            the value of batch_size of input Tensor. The default value is 0.
T
tianshuo78520a 已提交
752
        force_cpu(bool): data should be on CPU if it's true, default value is False.
Y
yuyang18 已提交
753 754

    Returns:
W
wangchaochaohu 已提交
755
        Variable: Tensor which will be created according to dtype.
H
haowang101779990 已提交
756 757 758 759 760

    Examples:

        .. code-block:: python

761
             import paddle.fluid as fluid
W
wangchaochaohu 已提交
762
             like = fluid.layers.fill_constant(shape=[1,2], value=10, dtype='int64') #like=[[10, 10]]
W
wangchaochaohu 已提交
763
             data = fluid.layers.fill_constant_batch_size_like(
W
wangchaochaohu 已提交
764
                    input=like, shape=[1], value=0, dtype='int64') #like=[[10, 10]] data=[0]
H
haowang101779990 已提交
765

766
    """
Y
Yu Yang 已提交
767
    helper = LayerHelper("fill_constant_batch_size_like", **locals())
X
Xin Pan 已提交
768
    out = helper.create_variable_for_type_inference(dtype=dtype)
769 770 771 772 773 774
    attrs = {
        'shape': shape,
        'dtype': out.dtype,
        'value': float(value),
        'input_dim_idx': input_dim_idx,
        'output_dim_idx': output_dim_idx,
775
        'force_cpu': force_cpu
776 777 778 779 780
    }
    if convert_dtype(dtype) in ['int64', 'int32']:
        attrs['str_value'] = str(int(value))
    else:
        attrs['str_value'] = str(float(value))
Y
Yu Yang 已提交
781 782 783 784
    helper.append_op(
        type='fill_constant_batch_size_like',
        inputs={'Input': input},
        outputs={'Out': [out]},
785
        attrs=attrs)
Y
Yu Yang 已提交
786 787 788 789
    out.stop_gradient = True
    return out


S
sneaxiy 已提交
790 791
def argmin(x, axis=0):
    """
792 793 794
	:alias_main: paddle.argmin
	:alias: paddle.argmin,paddle.tensor.argmin,paddle.tensor.search.argmin
	:old_api: paddle.fluid.layers.argmin
S
swtkiwi 已提交
795

S
sneaxiy 已提交
796 797
    **argmin**

798 799
    This OP computes the indices of the min elements of the input tensor's
    element along the provided axis.
S
sneaxiy 已提交
800 801

    Args:
802 803 804 805 806
        x(Variable): An input N-D Tensor with type float32, float64, int16,
            int32, int64, uint8.
        axis(int, optional): Axis to compute indices along. The effective range
            is [-R, R), where R is Rank(x). when axis<0, it works the same way
            as axis+R. Default is 0.
F
fengjiayi 已提交
807

S
sneaxiy 已提交
808
    Returns:
809
        Variable: A Tensor with data type int64.
F
fengjiayi 已提交
810

S
sneaxiy 已提交
811 812
    Examples:
        .. code-block:: python
F
fengjiayi 已提交
813

814
            import paddle.fluid as fluid
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
            import numpy as np

            in1 = np.array([[[5,8,9,5],
                            [0,0,1,7],
                            [6,9,2,4]],
                            [[5,2,4,2],
                            [4,7,7,9],
                            [1,7,0,6]]])
            with fluid.dygraph.guard():
                x = fluid.dygraph.to_variable(in1)
                out1 = fluid.layers.argmin(x=x, axis=-1)
                out2 = fluid.layers.argmin(x=x, axis=0)
                out3 = fluid.layers.argmin(x=x, axis=1)
                out4 = fluid.layers.argmin(x=x, axis=2)
                print(out1.numpy())
                # [[0 0 2]
                #  [1 0 2]]
                print(out2.numpy())
                # [[0 1 1 1]
                #  [0 0 0 0]
                #  [1 1 1 0]]
                print(out3.numpy())
                # [[1 1 1 2]
                #  [2 0 2 0]]
                print(out4.numpy())
                # [[0 0 2]
                #  [1 0 2]]
S
sneaxiy 已提交
842
    """
843 844 845
    check_variable_and_dtype(
        x, 'x', ['float32', 'float64', 'uint8', 'int16', 'int32', 'int64'],
        'argmin')
S
sneaxiy 已提交
846
    helper = LayerHelper("arg_min", **locals())
X
Xin Pan 已提交
847
    out = helper.create_variable_for_type_inference(VarDesc.VarType.INT64)
S
sneaxiy 已提交
848 849 850 851 852
    helper.append_op(
        type='arg_min',
        inputs={'X': x},
        outputs={'Out': [out]},
        attrs={'axis': axis})
853
    out.stop_gradient = True
S
sneaxiy 已提交
854 855 856 857 858 859 860
    return out


def argmax(x, axis=0):
    """
    **argmax**

861 862
    This OP computes the indices of the max elements of the input tensor's
    element along the provided axis.
S
sneaxiy 已提交
863 864

    Args:
865 866 867 868 869
        x(Variable): An input N-D Tensor with type float32, float64, int16,
            int32, int64, uint8.
        axis(int, optional): Axis to compute indices along. The effective range
            is [-R, R), where R is Rank(x). when axis<0, it works the same way
            as axis+R. Default is 0.
F
fengjiayi 已提交
870

S
sneaxiy 已提交
871
    Returns:
872
        Variable: A Tensor with data type int64.
F
fengjiayi 已提交
873

S
sneaxiy 已提交
874 875
    Examples:
        .. code-block:: python
F
fengjiayi 已提交
876

877
            import paddle.fluid as fluid
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
            import numpy as np

            in1 = np.array([[[5,8,9,5],
                            [0,0,1,7],
                            [6,9,2,4]],
                            [[5,2,4,2],
                            [4,7,7,9],
                            [1,7,0,6]]])
            with fluid.dygraph.guard():
                x = fluid.dygraph.to_variable(in1)
                out1 = fluid.layers.argmax(x=x, axis=-1)
                out2 = fluid.layers.argmax(x=x, axis=0)
                out3 = fluid.layers.argmax(x=x, axis=1)
                out4 = fluid.layers.argmax(x=x, axis=2)
                print(out1.numpy())
                # [[2 3 1]
                #  [0 3 1]]
                print(out2.numpy())
                # [[0 0 0 0]
                #  [1 1 1 1]
                #  [0 0 0 1]]
                print(out3.numpy())
                # [[2 2 0 1]
                #  [0 1 1 1]]
                print(out4.numpy())
                # [[2 3 1]
                #  [0 3 1]]
S
sneaxiy 已提交
905
    """
906 907 908
    check_variable_and_dtype(
        x, 'x', ['float32', 'float64', 'uint8', 'int16', 'int32', 'int64'],
        'argmax')
S
sneaxiy 已提交
909
    helper = LayerHelper("arg_max", **locals())
X
Xin Pan 已提交
910
    out = helper.create_variable_for_type_inference(VarDesc.VarType.INT64)
S
sneaxiy 已提交
911 912 913 914 915
    helper.append_op(
        type='arg_max',
        inputs={'X': x},
        outputs={'Out': [out]},
        attrs={'axis': axis})
916
    out.stop_gradient = True
S
sneaxiy 已提交
917 918 919
    return out


920
def argsort(input, axis=-1, descending=False, name=None):
Y
Yibing Liu 已提交
921
    """
922 923 924
	:alias_main: paddle.argsort
	:alias: paddle.argsort,paddle.tensor.argsort,paddle.tensor.search.argsort
	:old_api: paddle.fluid.layers.argsort
S
swtkiwi 已提交
925

926 927 928
    This OP sorts the input along the given axis, and returns sorted output
    data Varibale and its corresponding index Variable with the same shape as
    :attr:`input`.
Y
Yibing Liu 已提交
929 930

    Args:
931 932 933 934 935
        input(Variable): An input N-D Tensor with type float32, float64, int16,
            int32, int64, uint8.
        axis(int, optional): Axis to compute indices along. The effective range
            is [-R, R), where R is Rank(x). when axis<0, it works the same way
            as axis+R. Default is 0.
936 937 938
        descending(bool, optional) : Descending is a flag, if set to true,
            algorithm will sort by descending order, else sort by
            ascending order. Default is false.
939 940 941
        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`.
Y
Yibing Liu 已提交
942 943

    Returns:
944 945 946
        tuple: A tuple of sorted data Variable(with the same shape and data
        type as input) and the sorted indices(with the same shape as input's
        and with data type int64).
Y
Yibing Liu 已提交
947 948 949 950

    Examples:
        .. code-block:: python

951
            import paddle.fluid as fluid
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
            import numpy as np

            in1 = np.array([[[5,8,9,5],
                            [0,0,1,7],
                            [6,9,2,4]],
                            [[5,2,4,2],
                            [4,7,7,9],
                            [1,7,0,6]]]).astype(np.float32)
            with fluid.dygraph.guard():
                x = fluid.dygraph.to_variable(in1)
                out1 = fluid.layers.argsort(input=x, axis=-1)
                out2 = fluid.layers.argsort(input=x, axis=0)
                out3 = fluid.layers.argsort(input=x, axis=1)
                print(out1[0].numpy())
                # [[[5. 5. 8. 9.]
                #   [0. 0. 1. 7.]
                #   [2. 4. 6. 9.]]
                #  [[2. 2. 4. 5.]
                #   [4. 7. 7. 9.]
                #   [0. 1. 6. 7.]]]
                print(out1[1].numpy())
                # [[[0 3 1 2]
                #   [0 1 2 3]
                #   [2 3 0 1]]
                #  [[1 3 2 0]
                #   [0 1 2 3]
                #   [2 0 3 1]]]
                print(out2[0].numpy())
                # [[[5. 2. 4. 2.]
                #   [0. 0. 1. 7.]
                #   [1. 7. 0. 4.]]
                #  [[5. 8. 9. 5.]
                #   [4. 7. 7. 9.]
                #   [6. 9. 2. 6.]]]
                print(out3[0].numpy())
                # [[[0. 0. 1. 4.]
                #   [5. 8. 2. 5.]
                #   [6. 9. 9. 7.]]
                #  [[1. 2. 0. 2.]
                #   [4. 7. 4. 6.]
                #   [5. 7. 7. 9.]]]
Y
Yibing Liu 已提交
993
    """
994 995 996
    check_variable_and_dtype(
        input, 'input',
        ['float32', 'float64', 'int16', 'int32', 'int64', 'uint8'], 'argsort')
Y
Yibing Liu 已提交
997
    helper = LayerHelper("argsort", **locals())
X
Xin Pan 已提交
998 999 1000 1001
    out = helper.create_variable_for_type_inference(
        dtype=input.dtype, stop_gradient=True)
    ids = helper.create_variable_for_type_inference(
        VarDesc.VarType.INT64, stop_gradient=True)
Y
Yibing Liu 已提交
1002 1003 1004 1005
    helper.append_op(
        type='argsort',
        inputs={'X': input},
        outputs={'Out': out,
1006
                 'Indices': ids},
1007 1008
        attrs={'axis': axis,
               'descending': descending})
Y
Yibing Liu 已提交
1009 1010 1011
    return out, ids


Y
Yang Yu 已提交
1012
def ones(shape, dtype, force_cpu=False):
Y
Yu Yang 已提交
1013
    """
1014 1015
    The OP creates a tensor of specified :attr:`shape` and :attr:`dtype`, and fills it with 1.
    Its :attr:`stop_gradient` will be set to True to stop gradient computation.
1016

1017
    Parameters:
1018
        shape(tuple|list|Tensor): Shape of output Tensor, the data type of shape is int32 or int64.
W
wangchaochaohu 已提交
1019
        dtype (np.dtype|str): Data type of output Tensor, it supports
1020
            bool, float16, float32, float64, int32 and int64.
1021 1022
        force_cpu (bool, optional): Whether force to store the output Tensor in CPU memory.
            If :attr:`force_cpu` is False, the output Tensor will be stored in running device memory.
1023
            Default: False.
1024 1025

    Returns:
1026
        Tensor: A tensor of data type :attr:`dtype` with shape :attr:`shape` and all elements set to 1.
1027 1028 1029 1030

    Examples:
        .. code-block:: python

1031
          import paddle.fluid as fluid
1032 1033 1034 1035 1036
          data0 = fluid.layers.ones(shape=[2, 4], dtype='float32') # [[1., 1., 1., 1.], [1., 1., 1., 1.]]
          
          # shape is a Tensor
          shape = fluid.layers.fill_constant(shape=[2], dtype='int32', value=2)
          data1 = fluid.layers.ones(shape=shape, dtype='int32') #[[1, 1], [1, 1]]
Y
Yu Yang 已提交
1037 1038 1039 1040
    """
    return fill_constant(value=1.0, **locals())


1041
def zeros(shape, dtype, force_cpu=False, name=None):
Y
Yu Yang 已提交
1042
    """
1043 1044
    The OP creates a tensor of specified :attr:`shape` and :attr:`dtype`, and fills it with 0.
    Its :attr:`stop_gradient` will be set to True to stop gradient computation.
1045

1046
    Parameters:
1047
        shape(tuple|list|Tensor): Shape of output Tensor, the data type of ``shape`` is int32 or int64.
W
wangchaochaohu 已提交
1048
        dtype (np.dtype|str): Data type of output Tensor, it supports
1049
            bool, float16, float32, float64, int32 and int64.
1050 1051
        force_cpu (bool, optional): Whether force to store the output Tensor in CPU memory.
            If :attr:`force_cpu` is False, the output Tensor will be stored in running device memory.
1052
            Default: False.
1053 1054
        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`.
1055 1056

    Returns:
1057
        Tensor: A tensor of data type :attr:`dtype` with shape :attr:`shape` and all elements set to 0.
1058 1059 1060 1061

    Examples:
        .. code-block:: python

1062
          import paddle.fluid as fluid
1063
          data = fluid.layers.zeros(shape=[3, 2], dtype='float32') # [[0., 0.], [0., 0.], [0., 0.]]
1064 1065 1066 1067
          
          # shape is a Tensor
          shape = fluid.layers.fill_constant(shape=[2], dtype='int32', value=2)
          data1 = fluid.layers.zeros(shape=shape, dtype='int32') #[[0, 0], [0, 0]]
Y
Yu Yang 已提交
1068 1069
    """
    return fill_constant(value=0.0, **locals())
1070 1071


F
fengjiayi 已提交
1072 1073
def reverse(x, axis):
    """
1074 1075 1076
	:alias_main: paddle.reverse
	:alias: paddle.reverse,paddle.tensor.reverse,paddle.tensor.manipulation.reverse
	:old_api: paddle.fluid.layers.reverse
S
swtkiwi 已提交
1077

1078
    The OP reverses the tensor :attr:`x` along the given :attr:`axis`.
F
fengjiayi 已提交
1079

1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
    .. code-block:: text

        Case 1:

            Given a LoDTensor:
                x = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
                axis = [0, 1]

            Then:
                output = [[8, 7, 6], [5, 4, 3], [2, 1, 0]]

        Case 2:

            Given a LoDTensorArray:
                x = {[[0, 1], [2, 3]],
                     [[4, 5, 6]],
                     [[7],[8], [9]]}
                axis = 0

            Then:
                output = {[[7],[8], [9]],
                          [[4, 5, 6]],
                          [[0, 1], [2, 3]]}

1104
    Parameters:
1105 1106
        x (Variable): A tensor or LoDTensorArray to be reversed, its data type supports bool, float32, float64, int32, int64 and uint8.
                      If input is a LoDTensorArray, returns a new reversed LoDTensorArray without changing the internal order of each inner tensor.
1107 1108
        axis (int|tuple|list): A dimension or a set of dimensions of :attr:`x` to reverse. Must be
            in the range [-rank( :attr:`x` ), rank( :attr:`x` )). If it is a tuple or a list, reversing
1109 1110
            will be apply on each axis in the tuple or list. If input is a LoDTensorArray, the value of axis shall be 0, or a
            list [0] or tuple (0, ) with shape [1].
F
fengjiayi 已提交
1111 1112

    Returns:
1113
        Variable: The reversed tensor with the same shape and data type as :attr:`x`.
F
fengjiayi 已提交
1114 1115 1116 1117

    Examples:
        .. code-block:: python

1118
          import paddle.fluid as fluid
1119 1120 1121 1122
          import numpy as np
          data = fluid.layers.assign(np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]], dtype='float32')) # [[0., 1., 2.], [3., 4., 5.], [6., 7., 8.]]
          result1 = fluid.layers.reverse(data, 0) # [[6., 7., 8.], [3., 4., 5.], [0., 1., 2.]]
          result2 = fluid.layers.reverse(data, [0, 1]) # [[8., 7., 6.], [5., 4., 3.], [2., 1., 0.]]
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132

          # example of LoDTensorArray
          data1 = fluid.layers.assign(np.array([[0, 1, 2]], dtype='float32'))
          data2 = fluid.layers.assign(np.array([[3, 4, 5]], dtype='float32'))
          tensor_array = fluid.layers.create_array(dtype='float32')
          i = fluid.layers.fill_constant(shape=[1], dtype='int64', value=0)
          fluid.layers.array_write(data1, i, tensor_array)
          fluid.layers.array_write(data2, i+1, tensor_array)

          reversed_tensor_array = fluid.layers.reverse(tensor_array, 0) # {[[3, 4, 5]], [[0, 1, 2]]}
F
fengjiayi 已提交
1133
    """
1134 1135 1136
    check_variable_and_dtype(
        x, 'x', ('float32', 'float64', 'int32', 'int64', 'uint8'), 'reverse')
    check_type(axis, 'axis', (int, tuple, list), 'reverse')
F
fengjiayi 已提交
1137 1138 1139
    if isinstance(axis, int):
        axis = [axis]
    helper = LayerHelper("reverse", **locals())
X
Xin Pan 已提交
1140
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
F
fengjiayi 已提交
1141 1142
    helper.append_op(
        type='reverse',
W
Wu Yi 已提交
1143
        inputs={'X': x},
F
fengjiayi 已提交
1144 1145 1146 1147 1148
        outputs={'Out': [out]},
        attrs={'axis': axis})
    return out


1149 1150 1151 1152 1153 1154 1155
def save(x, file_path, overwrite=True):
    """
    Saves a variable as a file.

    Args:
        x(variable): The Tensor/LoDTensor to be saved.
        file_path(str): The file path where the variable will be saved.
1156 1157 1158
        overwrite(bool): Whether or not cover the given file when it has already
            existed. If it's set 'False' and the file is existed, a runtime
            error will be thrown.
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
    """
    helper = LayerHelper("save", **locals())
    helper.append_op(
        type="save",
        inputs={"input": x},
        outputs={},
        args={"file_path": file_path,
              "overwrite": overwrite})


def save_combine(x, file_path, overwrite=True):
    """
    Saves a list of variables into a single file.

    Args:
1174 1175
        x(list): A list of Tensor/LoDTensor variables to be saved together in
                 a single file.
1176
        file_path(str): The file path where variables will be saved.
1177
        overwrite(bool): Whether or not cover the given file when it has already
1178 1179
            existed. If it's set 'False' and the file is existed, a runtime
            error will be thrown.
1180 1181 1182 1183 1184 1185 1186 1187

    Returns:
        There is no return value.

    Examples:

        .. code-block:: python

1188
            import paddle.fluid as fluid
1189 1190 1191 1192 1193 1194 1195
            v1 = fluid.layers.data(name="data",
                                   shape=(4, 6),
                                   dtype="float32")
            v2 = fluid.layers.data(name="data",
                                   shape=(6, 8, 4),
                                   dtype="float32")
            normed = fluid.layers.save_combine([v1, v2], file_path="output")
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
    """
    helper = LayerHelper("save_combine", **locals())
    helper.append_op(
        type="save_combine",
        inputs={"input": x},
        outputs={},
        args={"file_path": file_path,
              "overwrite": overwrite})


def load_combine(out, file_path):
    """
T
tianshuo78520a 已提交
1208
    Loads a list of variable from a single file.
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219

    Args:
        out(list): The list of variables to be read from the disk file.
        file_path(str): The path of the disk file.
    """
    helper = LayerHelper("load_combine", **locals())
    helper.append_op(
        type="load_combine",
        inputs={},
        output={"Out": out},
        args={"file_path": file_path})
1220 1221 1222 1223 1224 1225 1226


def has_inf(x):
    """
    Test if any of x contains an infinity number

    Args:
S
Steffy-zxf 已提交
1227
       x (Tensor): The Tensor to be checked.
1228 1229

    Returns:
S
Steffy-zxf 已提交
1230
       Tensor: The tensor storing the output, only a bool value, indicating that whether there is infinity number in x or not.
1231 1232 1233 1234
    
    Examples:
        .. code-block:: python
          
S
Steffy-zxf 已提交
1235 1236
          import paddle
          data = paddle.randn(shape=[4, 32, 32], dtype="float32")
1237
          res = paddle.fluid.layers.has_inf(data)
S
Steffy-zxf 已提交
1238
          # [False]
1239

1240
    """
S
Steffy-zxf 已提交
1241 1242 1243
    if in_dygraph_mode():
        return core.ops.isinf(x)

1244
    check_type(x, 'x', (Variable), 'has_inf')
1245
    helper = LayerHelper("isinf", **locals())
X
Xin Pan 已提交
1246
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
1247 1248 1249 1250 1251 1252 1253 1254 1255
    helper.append_op(type="isinf", inputs={"X": x}, outputs={"Out": out})
    return out


def has_nan(x):
    """
    Test if any of x contains a NAN

    Args:
S
Steffy-zxf 已提交
1256
       x (Tensor): The Tensor to be checked.
1257 1258

    Returns:
S
Steffy-zxf 已提交
1259
       Tensor: The tensor variable storing the output, only a bool value, indicating that whether there is NAN in x or not.
1260 1261 1262 1263
    
    Examples:
        .. code-block:: python
    
S
Steffy-zxf 已提交
1264 1265
          import paddle
          data = paddle.randn(shape=[2,3], dtype="float32")
1266
          res = paddle.fluid.layers.has_nan(data)
S
Steffy-zxf 已提交
1267
          # [False]
1268

1269
    """
S
Steffy-zxf 已提交
1270 1271 1272
    if in_dygraph_mode():
        return core.ops.isnan(x)

1273
    check_type(x, 'x', (Variable), 'has_nan')
1274
    helper = LayerHelper("isnan", **locals())
X
Xin Pan 已提交
1275
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
1276 1277 1278 1279 1280 1281
    helper.append_op(type="isnan", inputs={"X": x}, outputs={"Out": out})
    return out


def isfinite(x):
    """
S
swtkiwi 已提交
1282

1283 1284 1285 1286
    Test if any of x contains an infinity/NAN number. If all the elements are finite,
    returns true, else false.

    Args:
N
Noel 已提交
1287
        x(Tensor): The Tensor to be checked.
1288 1289

    Returns:
N
Noel 已提交
1290
        Tensor: The tensor storing the output, contains a bool value.
1291 1292 1293 1294 1295

    Examples:

        .. code-block:: python

N
Noel 已提交
1296 1297 1298 1299 1300 1301
            import paddle

            x = paddle.rand(shape=[4, 6], dtype='float32')
            y = paddle.fluid.layers.isfinite(x)
            print(y)

1302
    """
1303 1304
    check_variable_and_dtype(x, "x", ["float32", "float64", "int32", "int64"],
                             "isfinite")
1305
    helper = LayerHelper("isfinite", **locals())
1306

1307
    out = helper.create_variable_for_type_inference(dtype='bool')
1308 1309
    helper.append_op(type="isfinite", inputs={"X": x}, outputs={"Out": out})
    return out
W
whs 已提交
1310 1311


1312
def range(start, end, step, dtype, name=None):
W
whs 已提交
1313
    """
1314
    This OP returns a 1-D Tensor with spaced values within a given interval.
W
whs 已提交
1315

1316 1317
    Values are generated into the half-open interval [``start``, ``end``) with
    the ``step``. (the interval including ``start`` but excluding ``end``).
1318

1319 1320
    If ``dtype`` is float32 or float64, we advise adding a small epsilon to
    ``end`` to avoid floating point rounding errors when comparing against ``end``.
W
whs 已提交
1321

L
Liufang Sang 已提交
1322
    Parameters:
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
        start(float|int|Tensor): Start of interval. The interval includes this
            value. If ``start`` is a Tensor, it is a 1-D Tensor with shape [1],
            with data type int32, int64, float32, float64.
        end(float|int|Tensor): End of interval. The interval does not include
            this value. If ``end`` is a Tensor, it is a 1-D Tensor with shape
            [1], with data type int32, int64, float32, float64.
        step(float|int|Tensor): Spacing between values. For any out, it is
            the istance between two adjacent values, out[i+1] - out[i]. If
            ``step`` is a Tensor, it is a 1-D Tensor with shape [1], with data
            type int32, int64, float32, float64.
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of the
            output tensor. Supported data types: int32, int64, float32, float64.
        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`.

    Returns: 
        Tensor: A 1-D Tensor with values from the interval [``start``, ``end``)
            taken with common difference ``step`` beginning from ``start``. Its
            data type is set by ``dtype``.

    Raises:
        TypeError: If ``dtype`` is not int32, int64, float32, float64.
W
whs 已提交
1346 1347 1348 1349 1350

    examples:

        .. code-block:: python

1351
            import paddle.fluid as fluid
W
whs 已提交
1352

1353 1354
            out1 = fluid.layers.range(0, 10, 2, 'int32')
            # [0, 2, 4, 6, 8]
W
whs 已提交
1355

1356 1357 1358 1359 1360 1361 1362
            start_var = fluid.layers.fill_constant([1], 'int64', 3)
            out2 = fluid.layers.range(start_var, 7, 1, 'int64')
            # [3, 4, 5, 6]

    """
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
1363

W
whs 已提交
1364
    if not isinstance(start, Variable):
1365 1366
        with device_guard("cpu"):
            start = fill_constant([1], dtype, start)
1367 1368
    elif start.dtype != dtype:
        start = cast(start, dtype)
1369

W
whs 已提交
1370
    if not isinstance(end, Variable):
1371 1372
        with device_guard("cpu"):
            end = fill_constant([1], dtype, end)
1373 1374
    elif end.dtype != dtype:
        end = cast(end, dtype)
1375

W
whs 已提交
1376
    if not isinstance(step, Variable):
1377 1378
        with device_guard("cpu"):
            step = fill_constant([1], dtype, step)
1379 1380
    elif step.dtype != dtype:
        step = cast(step, dtype)
W
whs 已提交
1381

1382 1383
    if in_dygraph_mode():
        return core.ops.range(start, end, step)
W
whs 已提交
1384

1385 1386 1387 1388
    check_dtype(dtype, 'dtype', ['float32', 'float64', 'int32', 'int64'],
                'range/arange')
    helper = LayerHelper('range', **locals())
    out = helper.create_variable_for_type_inference(dtype)
W
whs 已提交
1389 1390 1391 1392 1393
    helper.append_op(
        type='range',
        inputs={'Start': start,
                'End': end,
                'Step': step},
1394
        outputs={'Out': out})
1395
    out.stop_gradient = True
W
whs 已提交
1396
    return out
Z
zhoukunsheng 已提交
1397 1398


1399
def linspace(start, stop, num, dtype=None, name=None):
1400
    r"""
1401
    This OP return fixed number of evenly spaced values within a given interval.
Z
zhoukunsheng 已提交
1402 1403

    Args:
1404 1405 1406 1407
        start(int|float|Tensor): The input :attr:`start` is start variable of range. It is a scalar, \
            or a Tensor of shape [1] with input data type int32, int64, float32 or float64.
        stop(int|float|Tensor): The input :attr:`stop` is start variable of range. It is a scalar, \
            or a Tensor of shape [1] with input data type int32, int64, float32 or float64.
1408
        num(int|Tensor): The input :attr:`num` is given num of the sequence. It is an int scalar, \
1409
            or a Tensor of shape [1] with data type int32.
W
wangchaochaohu 已提交
1410
        dtype(np.dtype|str, optional): The data type of output tensor, it could be
1411
            int32, int64, float32 and float64. Default: if None, the data type is float32.
1412 1413
        name(str, optional): Normally there is no need for user to set this property. 
            For more information, please refer to :ref:`api_guide_Name`.Default: None.
Z
zhoukunsheng 已提交
1414 1415

    Returns:
1416
        Tensor: the output data type will be float32, float64. The 1-D tensor with fixed number of evenly spaced values, \
1417 1418
        the data shape of this tensor is :math:`[num]` . If the :attr:`num` is set 1, the output tensor just has \
        the value with input :attr:`start`. 
Z
zhoukunsheng 已提交
1419

Z
zhoukunsheng 已提交
1420
    Examples:
Z
zhoukunsheng 已提交
1421 1422
        .. code-block:: python

1423 1424 1425
             import paddle
             data = paddle.linspace(0, 10, 5, 'float32') # [0.0,  2.5,  5.0,  7.5, 10.0]
             data = paddle.linspace(0, 10, 1, 'float32') # [0.0]
Z
zhoukunsheng 已提交
1426 1427

    """
1428 1429
    if dtype is None:
        dtype = 'float32'
1430 1431 1432
    tensor_num = num
    tensor_start = start
    tensor_stop = stop
1433 1434
    if not isinstance(num, Variable):
        check_type(num, 'num', (int), 'linspace')
1435 1436
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
Z
zhoukunsheng 已提交
1437
    if not isinstance(start, Variable):
1438 1439
        with device_guard("cpu"):
            tensor_start = fill_constant([1], dtype, start)
Z
zhoukunsheng 已提交
1440
    if not isinstance(stop, Variable):
1441 1442
        with device_guard("cpu"):
            tensor_stop = fill_constant([1], dtype, stop)
Z
zhoukunsheng 已提交
1443
    if not isinstance(num, Variable):
1444 1445
        with device_guard("cpu"):
            tensor_num = fill_constant([1], 'int32', num)
1446
    if in_dygraph_mode():
1447 1448
        return core.ops.linspace(tensor_start, tensor_stop, tensor_num, 'dtype',
                                 dtype)
1449 1450 1451

    helper = LayerHelper("linspace", **locals())

1452 1453 1454
    start_dtype = convert_dtype(tensor_start.dtype)
    stop_dtype = convert_dtype(tensor_stop.dtype)
    out_dtype = convert_dtype(dtype)
1455
    if isinstance(start, Variable):
1456 1457
        check_dtype(start.dtype, 'start',
                    ['float32', 'float64', 'int32', 'int64'], 'linspace')
1458 1459
    else:
        check_type(start, 'start', (int, float), 'linspace')
Z
zhoukunsheng 已提交
1460

1461
    if isinstance(stop, Variable):
1462 1463
        check_dtype(stop.dtype, 'stop',
                    ['float32', 'float64', 'int32', 'int64'], 'linspace')
1464 1465 1466 1467 1468 1469
    else:
        check_type(stop, 'stop', (int, float), 'linspace')
    if isinstance(num, Variable):
        check_dtype(num.dtype, 'num', ['int32'], 'linspace')
    check_dtype(dtype, 'dtype', ['int32', 'int64', 'float32', 'float64'],
                'linspace')
1470 1471 1472 1473 1474 1475 1476 1477
    if ((stop_dtype == "float64" or start_dtype == "float64") and
            out_dtype in ["float32", "int32"]) or ((stop_dtype == "int64" or
                                                    start_dtype == "int64") and
                                                   out_dtype == "int32"):
        raise ValueError(
            "The dtype of start/stop is {}/{} but the attr(dtype) of linspace is {}, "
            "which may cause data type overflows. Please reset attr(dtype) of linspace."
            .format(start_dtype, stop_dtype, dtype))
1478 1479

    out = helper.create_variable_for_type_inference(dtype=dtype)
Z
zhoukunsheng 已提交
1480 1481 1482

    helper.append_op(
        type='linspace',
1483 1484 1485 1486
        inputs={'Start': tensor_start,
                'Stop': tensor_stop,
                'Num': tensor_num},
        attrs={'dtype': dtype},
Z
zhoukunsheng 已提交
1487
        outputs={'Out': [out]})
1488 1489
    if isinstance(num, int):
        out.desc.set_shape((num, ))
Z
zhoukunsheng 已提交
1490
    return out
1491 1492


Z
zhoukunsheng 已提交
1493 1494
def zeros_like(x, out=None):
    """
1495
    This OP creates a zeros tensor which has identical shape and dtype 
Z
zhoukunsheng 已提交
1496 1497 1498
    with `x`.

    Args:
1499 1500 1501 1502 1503 1504
        x(Variable): The input tensor which specifies shape and dtype, the
            input data dtype could be bool, float32, float64, int32, int64.
        out(Variable, optional): If is :attr:`None` , the op will create the
            variable as output, the data type and shape of this variable will
            be same as input :attr:`x`. If is a tensor, the data type and shape
            need to be same as input :attr:`x`. The default value is :attr:`None` .
Z
zhoukunsheng 已提交
1505 1506

    Returns:
1507 1508 1509
        Variable: The N-D tensor, the element in tensor is related to input
            data type, if the input data type is bool, the output value is
            False, otherwise is zero. The output shape is the same as the input.
Z
zhoukunsheng 已提交
1510 1511 1512 1513

    Examples:
        .. code-block:: python

1514
          import paddle.fluid as fluid
1515
          x = fluid.data(name='x', dtype='float32', shape=[3])
Z
zhoukunsheng 已提交
1516 1517
          data = fluid.layers.zeros_like(x) # [0.0, 0.0, 0.0]

Z
zhoukunsheng 已提交
1518 1519
    """

1520 1521
    check_variable_and_dtype(
        x, "x", ['bool', 'float32', 'float64', 'int32', 'int64'], 'ones_like')
Z
zhoukunsheng 已提交
1522 1523 1524
    helper = LayerHelper("zeros_like", **locals())
    if out is None:
        out = helper.create_variable_for_type_inference(dtype=x.dtype)
1525 1526 1527
    else:
        check_variable_and_dtype(
            out, "out", ['bool', 'float32', 'float64', 'int32', 'int64'],
1528
            'zeros_like')
1529

Z
zhoukunsheng 已提交
1530 1531 1532 1533
    helper.append_op(
        type='fill_zeros_like', inputs={'X': [x]}, outputs={'Out': [out]})
    out.stop_gradient = True
    return out
Z
zhoukunsheng 已提交
1534 1535


1536
@deprecated(since="2.0.0", update_to="paddle.diag")
Z
zhoukunsheng 已提交
1537
def diag(diagonal):
1538
    r"""
1539 1540 1541
	:alias_main: paddle.diag
	:alias: paddle.diag,paddle.tensor.diag,paddle.tensor.creation.diag
	:old_api: paddle.fluid.layers.diag
S
swtkiwi 已提交
1542

1543
    This OP creates a square matrix which has diagonal values specified by input :attr:`diagonal`.
Z
zhoukunsheng 已提交
1544 1545

    Args:
1546 1547
        diagonal(Variable|numpy.ndarray): The input tensor should be 1D tensor, the input shape is :math:`[ N]` , \
            specifying diagonal values by this input tensor. The input data type should be float32, float64, int32, int64.
Z
zhoukunsheng 已提交
1548 1549

    Returns:
1550 1551
        Variable, the output data type is the same as input data type.: The tensor variable storing the square matrix, \
            the diagonal values specified by input :attr:`diagonal`. the output shape is :math:`[N, N]` with two dims.
Z
zhoukunsheng 已提交
1552 1553 1554 1555 1556 1557 1558

    Examples:
        .. code-block:: python

          # [[3, 0, 0]
          #  [0, 4, 0]
          #  [0, 0, 5] 
1559 1560 1561

          import paddle.fluid as fluid
          import numpy as np
1562 1563 1564
          diagonal = np.arange(3, 6, dtype='int32')
          data = fluid.layers.diag(diagonal)
          # diagonal.shape=(3,) data.shape=(3, 3)
Z
zhoukunsheng 已提交
1565 1566

    """
1567 1568 1569
    check_type(diagonal, 'diagonal', (Variable, numpy.ndarray), 'diag')
    check_dtype(diagonal.dtype, 'diagonal',
                ['float32', 'float64', 'int32', 'int64'], 'diag')
Z
zhoukunsheng 已提交
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581
    helper = LayerHelper("diag", **locals())

    if not isinstance(diagonal, Variable):
        diagonal = assign(diagonal)

    out = helper.create_variable_for_type_inference(dtype=diagonal.dtype)

    helper.append_op(
        type='diag', inputs={'Diagonal': [diagonal]}, outputs={'Out': [out]})

    out.stop_gradient = True
    return out
Z
zhoukunsheng 已提交
1582 1583


1584 1585 1586 1587 1588
def eye(num_rows,
        num_columns=None,
        batch_shape=None,
        dtype='float32',
        name=None):
1589
    """
1590
    This function constructs a or a batch of 2-D tensor with ones on the diagonal and zeros elsewhere. 
1591 1592 1593

    Args:
        num_rows(int): the number of rows in each batch tensor.
1594 1595
        num_columns(int, optional): the number of columns in each batch tensor.
            If None, default: num_rows.
1596 1597
        batch_shape(list, optional): If provided, the returned tensor will have a leading
            batch size of this shape, the data type of ``batch_shape`` is int. Default is None.
W
wangchaochaohu 已提交
1598
        dtype(np.dtype|str, optional): The data type of the returned tensor.
1599 1600 1601 1602
            It should be int32, int64, float16, float32, float64, default is 'float32'.
        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`.
1603 1604

    Returns:
1605
        Tensor: An identity Tensor or LoDTensor of shape batch_shape + [num_rows, num_columns].
1606 1607 1608 1609 1610

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid
1611 1612
          data = fluid.layers.eye(3, dtype='int32')
          # [[1, 0, 0]
1613
          #  [0, 1, 0]
1614 1615
          #  [0, 0, 1]]

1616
          data = fluid.layers.eye(2, 3, dtype='int32')
1617
          # [[1, 0, 0]
1618
          #  [0, 1, 0]]
1619 1620

          data = fluid.layers.eye(2, batch_shape=[3])
1621 1622 1623 1624 1625
          # Construct a batch of 3 identity tensors, each 2 x 2.
          # data[i, :, :] is a 2 x 2 identity tensor, i = 0, 1, 2.

    """

1626 1627
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
1628 1629 1630 1631 1632
    if num_columns is not None:
        if not isinstance(num_columns, int) or num_columns < 0:
            raise TypeError("num_columns should be a non-negative int")
    else:
        num_columns = num_rows
1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654

    if in_dygraph_mode():
        out = core.ops.eye('dtype', dtype, 'num_rows', num_rows, 'num_columns',
                           num_columns)

    else:
        helper = LayerHelper("eye", **locals())
        check_dtype(dtype, 'dtype',
                    ['float16', 'float32', 'float64', 'int32', 'int64'], 'eye')
        if not isinstance(num_rows, int) or num_rows < 0:
            raise TypeError("num_rows should be a non-negative int")
        out = helper.create_variable_for_type_inference(dtype=dtype)
        helper.append_op(
            type='eye',
            inputs={},
            outputs={'Out': [out]},
            attrs={
                'num_rows': num_rows,
                'num_columns': num_columns,
                'dtype': dtype
            },
            stop_gradient=True)
1655 1656

    if batch_shape is not None:
1657 1658 1659 1660 1661 1662 1663
        re_shape = [1] * len(batch_shape)
        re_shape = re_shape + [num_rows, num_columns]
        expand_times = batch_shape + [1, 1]
        if in_dygraph_mode():
            out = core.ops.reshape(out, 'shape', re_shape)
            return core.ops.expand(out, 'expand_times', expand_times)

1664 1665
        if not isinstance(batch_shape, list):
            raise TypeError("batch_shape should be a list")
1666
        for batch_val in (batch_shape):
1667 1668
            if batch_val <= 0:
                raise TypeError("batch_shape should be a positive int list")
1669 1670 1671 1672 1673 1674

        from .nn import reshape, expand
        out = reshape(x=out, shape=re_shape)
        out = expand(x=out, expand_times=expand_times)

    out.stop_gradient = True
1675 1676 1677
    return out


Z
zhoukunsheng 已提交
1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
def ones_like(x, out=None):
    """
    **ones_like**

    This function creates a ones tensor which has identical shape and dtype 
    with `x`.

    Args:
        x(Variable): The input tensor which specifies shape and dtype.
        out(Variable): The output tensor.

    Returns:
1690
        out(Variable): The tensor variable storing the output.
Z
zhoukunsheng 已提交
1691 1692 1693 1694 1695 1696 1697 1698 1699 1700

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid

          x = fluid.layers.data(name='x', dtype='float32', shape=[3], append_batch_size=False)
          data = fluid.layers.ones_like(x) # [1.0, 1.0, 1.0]

    """
1701 1702
    check_variable_and_dtype(
        x, "x", ['bool', 'float32', 'float64', 'int32', 'int64'], 'ones_like')
Z
zhoukunsheng 已提交
1703 1704 1705 1706

    helper = LayerHelper("ones_like", **locals())
    if out is None:
        out = helper.create_variable_for_type_inference(dtype=x.dtype)
1707 1708 1709 1710
    else:
        check_variable_and_dtype(
            out, "out", ['bool', 'float32', 'float64', 'int32', 'int64'],
            'ones_like')
Z
zhoukunsheng 已提交
1711 1712 1713 1714 1715 1716
    helper.append_op(
        type='fill_any_like',
        inputs={'X': [x]},
        attrs={'value': 1.0},
        outputs={'Out': [out]})
    return out
Y
yaoxuefeng 已提交
1717 1718 1719 1720 1721 1722


@deprecated(since="2.0.0", update_to="paddle.triu")
def triu(input, diagonal=0, name=None):
    import paddle
    return paddle.tensor.triu(x=input, diagonal=diagonal, name=name)