nn.py 263.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
# Copyright (c) 2018 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.
Y
Yu Yang 已提交
14
"""
15
All layers just related to the neural network.
Y
Yu Yang 已提交
16
"""
P
peizhilin 已提交
17
import os
S
sneaxiy 已提交
18
import inspect
19 20 21 22 23
import warnings

import numpy as np

import paddle
Y
Yu Yang 已提交
24
from ..layer_helper import LayerHelper
25
from paddle.fluid.framework import _in_legacy_dygraph
26
from ..initializer import Normal, Constant
27 28 29 30 31 32 33 34 35 36 37 38 39
from ..framework import (
    Variable,
    OpProtoHolder,
    _non_static_mode,
    dygraph_only,
    _dygraph_tracer,
    default_main_program,
    _varbase_creator,
    static_only,
    _global_flags,
    _in_legacy_dygraph,
    in_dygraph_mode,
)
40
from ..framework import _current_expected_place
41
from .. import dygraph_utils
Y
yangyaming 已提交
42
from ..param_attr import ParamAttr
43 44 45 46 47
from .layer_function_generator import (
    autodoc,
    templatedoc,
    _generate_doc_string_,
)
48
from .tensor import concat, assign, fill_constant, zeros, tensor_array_to_tensor
49
from . import utils
F
fengjiayi 已提交
50
from .. import unique_name
51
from functools import reduce
52
from .. import core
53
from ...utils import deprecated
54 55 56 57 58 59
from ..data_feeder import (
    convert_dtype,
    check_variable_and_dtype,
    check_type,
    check_dtype,
)
60
from paddle.utils import deprecated
61
from paddle import _C_ops, _legacy_C_ops
62 63
from collections.abc import Iterable

Y
Yu Yang 已提交
64 65

__all__ = [
X
Xin Pan 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    'fc',
    'embedding',
    'linear_chain_crf',
    'crf_decoding',
    'conv2d',
    'softmax',
    'pool2d',
    'batch_norm',
    'dropout',
    'split',
    'ctc_greedy_decoder',
    'l2_normalize',
    'matmul',
    'topk',
    'im2sequence',
    'row_conv',
    'multiplex',
    'layer_norm',
D
dengkaipeng 已提交
84
    'spectral_norm',
X
Xin Pan 已提交
85 86 87 88 89 90 91 92
    'smooth_l1',
    'one_hot',
    'autoincreased_step_counter',
    'unsqueeze',
    'lod_reset',
    'pad',
    'image_resize',
    'resize_bilinear',
K
Kaipeng Deng 已提交
93
    'resize_trilinear',
94
    'resize_nearest',
X
Xin Pan 已提交
95 96 97 98 99 100 101 102 103 104 105 106
    'relu',
    'elementwise_add',
    'elementwise_div',
    'elementwise_sub',
    'elementwise_mul',
    'gaussian_random',
    'sampling_id',
    'shape',
    'clip',
    'clip_by_norm',
    'mean',
    'mul',
M
minqiyang 已提交
107
    'hash',
D
dengkaipeng 已提交
108
    'grid_sampler',
G
gmcather 已提交
109
    'log_loss',
Q
Qiao Longfei 已提交
110
    'bilinear_tensor_product',
C
chengduo 已提交
111 112
    'merge_selected_rows',
    'get_tensor_from_selected_rows',
113
    'temporal_shift',
H
heqiaozhi 已提交
114
    'continuous_value_model',
115
    'unfold',
C
cjt222 已提交
116
    'deformable_roi_pooling',
117
    'shard_index',
H
huangjun12 已提交
118
    'hard_swish',
K
Kaipeng Deng 已提交
119
    'mish',
120
    'uniform_random',
myq406450149's avatar
myq406450149 已提交
121
    'unbind',
Y
Yu Yang 已提交
122 123
]

124
OP_NAMEMAPPING = {
125 126 127 128 129 130 131 132
    'elementwise_max': 'maximum',
    'elementwise_min': 'minimum',
    'elementwise_pow': 'elementwise_pow',
    'elementwise_floordiv': 'floor_divide',
    'elementwise_add': 'add',
    'elementwise_sub': 'subtract',
    'elementwise_mul': 'multiply',
    'elementwise_div': 'divide',
C
Chen Weihang 已提交
133
    'elementwise_mod': 'remainder',
134 135
}

Y
Yu Yang 已提交
136

137 138
def _get_reduce_dim(dim, input):
    """
139
    Internal function for reduce_sum, reduce_mean, reduce_prod.
140 141 142 143 144 145 146 147 148
    It computes the attribute reduce_all value based on axis.
    """
    if dim is not None and not isinstance(dim, list):
        if isinstance(dim, (tuple, range)):
            dim = list(dim)
        elif isinstance(dim, int):
            dim = [dim]
        else:
            raise TypeError(
149 150 151 152
                "The type of dim must be int, list, tuple or range, but received {}".format(
                    type(axis)
                )
            )
153 154 155 156 157 158 159 160 161 162
    if dim is None:
        dim = []
    if dim == [] or len(dim) == len(input.shape):
        reduce_all = True
    else:
        reduce_all = False

    return reduce_all, dim


163
@dygraph_only
164 165 166
def _elementwise_op_in_dygraph(
    x, y, axis=-1, act=None, use_mkldnn=False, op_name=None
):
167 168 169 170
    def is_inplace(op_name):
        return op_name[-1] == "_"

    if op_name not in OP_NAMEMAPPING.keys() or axis != -1:
171
        op = getattr(_legacy_C_ops, op_name)
172 173 174
        out = op(x, y, 'axis', axis, 'use_mkldnn', use_mkldnn)
    else:
        if in_dygraph_mode():
175 176
            op = getattr(
                _C_ops,
177 178
                OP_NAMEMAPPING[op_name] if not is_inplace(op_name) else op_name,
            )
179 180 181
            out = op(x, y)

        if _in_legacy_dygraph():
182
            op = getattr(_legacy_C_ops, op_name)
183
            out = op(x, y, 'axis', axis, 'use_mkldnn', use_mkldnn)
184 185 186 187 188 189 190 191 192 193 194 195 196 197
    return dygraph_utils._append_activation_in_dygraph(
        out, act, use_mkldnn=use_mkldnn
    )


def fc(
    input,
    size,
    num_flatten_dims=1,
    param_attr=None,
    bias_attr=None,
    act=None,
    name=None,
):
198
    r"""
199 200
    :api_attr: Static Graph

201
    **Fully Connected Layer**
Y
Yu Yang 已提交
202

203 204 205
    This operator creates a fully connected layer in the network. It can take
    a Tensor(or LoDTensor) or a list of Tensor(or LoDTensor) as its inputs(see
    Args in detail). It creates a variable called weight for each input Tensor,
206
    which represents a fully connected weight matrix from each input unit to
207 208 209 210
    each output unit. The fully connected layer multiplies each input Tensor
    with its corresponding weight to produce an output Tensor with shape :math:`[M, size]` ,
    where M is batch size. If a list of Tensor is given, the results of
    multiple output Tensors with shape :math:`[M, size]` will be summed up. If :attr:`bias_attr`
211
    is not None, a bias variable will be created and added to the output.
212
    Finally, if :attr:`act` is not None, it will be applied to the output as well.
C
caoying03 已提交
213

214
    When the input is a single Tensor(or LoDTensor):
C
caoying03 已提交
215

216 217 218 219
    .. math::

        Out = Act({XW + b})

220
    When the input is a list of Tensor(or LoDTensor):
221 222 223

    .. math::

224
        Out = Act({\sum_{i=0}^{N-1}X_iW_i + b})
225 226 227

    In the above equation:

228 229 230
    * :math:`N`: Number of the input. N equals to len(input) if input is list of Variable.
    * :math:`X_i`: The i-th input tensor.
    * :math:`W_i`: The i-th weights matrix corresponding i-th input tensor.
C
caoying03 已提交
231
    * :math:`b`: The bias parameter created by this layer (if needed).
232
    * :math:`Act`: The activation function.
233
    * :math:`Out`: The output Tensor.
234 235 236

    .. code-block:: text

237 238 239 240 241 242 243 244 245 246 247 248 249 250
        Case 1:
        Given a single Tensor data_1, and num_flatten_dims = 2:
            data_1.data = [[[0.1, 0.2],
                            [0.3, 0.4]]]
            data_1.shape = (1, 2, 2) # 1 is batch_size

            out = fluid.layers.fc(input=data_1, size=1, num_flatten_dims=2)

        Then output is:
            out.data = [[0.83234344], [0.34936576]]
            out.shape = (1, 2, 1)

        Case 2:
        Given a list of Tensor:
251 252 253 254 255 256 257 258 259 260 261 262 263
            data_1.data = [[[0.1, 0.2],
                           [0.3, 0.4]]]
            data_1.shape = (1, 2, 2) # 1 is batch_size

            data_2 = [[[0.1, 0.2, 0.3]]]
            data_2.shape = (1, 1, 3)

            out = fluid.layers.fc(input=[data_1, data_2], size=2)

        Then:
            out.data = [[0.18669507, 0.1893476]]
            out.shape = (1, 2)

Y
Yu Yang 已提交
264
    Args:
265 266 267
        input (Variable|list of Variable): A Tensor(or LoDTensor) with shape :math:`[N_1, N_2,..., N_k]` or
            a list of Tensor(or LoDTensor). The dimensions of the input Tensor is at least 2 and the data
            type should be float32 or float64.
T
tianshuo78520a 已提交
268
        size(int): The number of output units in this layer, which also means the feature size of output
269 270
            Tensor(or LoDTensor).
        num_flatten_dims (int): The fc layer can accept an input Tensor with more than
R
ranqiu 已提交
271
            two dimensions. If this happens, the multidimensional tensor will first be flattened
272 273
            into a 2-D matrix. The parameter :attr:`num_flatten_dims` determines how the input
            Tensor is flattened: the first :attr:`num_flatten_dims` (inclusive, index starts from 1)
R
ranqiu 已提交
274
            dimensions will be flatten to form the first dimension of the final matrix (height of
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
            the matrix), and the rest :math:`rank(X) - num\_flatten\_dims` dimensions are flattened to
            form the second dimension of the final matrix (width of the matrix). For example, assuming that
            X is a 5-dimensional Tensor with a shape [2, 3, 4, 5, 6], and :attr:`num_flatten_dims` = 3.
            Then, the flattened matrix will have a shape [2 x 3 x 4, 5 x 6] = [24, 30]. Default: 1.
        param_attr (ParamAttr): To specify the weight parameter property. Default: None, which means the
            default weight parameter property is used. See usage for details in :ref:`api_fluid_ParamAttr` .
        bias_attr (ParamAttr): To specify the bias parameter property. Default: None, which means the
            default bias parameter property is used. See usage for details in :ref:`api_fluid_ParamAttr` .
        act (str): Activation to be applied to the output of this layer, such as tanh, softmax,
            sigmoid, relu. For more information, please refer to :ref:`api_guide_activations_en` . Default: 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` .

    Returns:
        Variable: Tensor or LoDTensor calculated by fc layer. The data type is same with input.
290 291

    Raises:
292
        ValueError: If dimensions of the input Tensor is less than 2.
293 294 295 296

    Examples:
        .. code-block:: python

297
          import paddle.fluid as fluid
298 299
          import paddle
          paddle.enable_static()
300
          # when input is single tensor
301
          data = fluid.data(name="data", shape=[-1, 32], dtype="float32")
302
          fc = fluid.layers.fc(input=data, size=1000, act="tanh")
303 304

          # when input are multiple tensors
305 306
          data_1 = fluid.data(name="data_1", shape=[-1, 32], dtype="float32")
          data_2 = fluid.data(name="data_2", shape=[-1, 36], dtype="float32")
307
          fc = fluid.layers.fc(input=[data_1, data_2], size=1000, act="tanh")
Y
Yu Yang 已提交
308
    """
C
caoying03 已提交
309
    helper = LayerHelper("fc", **locals())
310
    check_type(input, 'input', (list, tuple, Variable), 'fc')
311 312
    if isinstance(input, (list, tuple)):
        for i, input_x in enumerate(input):
313
            check_type(input_x, 'input[' + str(i) + ']', Variable, 'fc')
Y
Yu Yang 已提交
314
    dtype = helper.input_dtype()
315 316 317
    check_dtype(
        dtype, 'input', ['float16', 'uint16', 'float32', 'float64'], 'fc'
    )
Y
Yu Yang 已提交
318
    mul_results = []
319 320
    for input_var, param_attr in helper.iter_inputs_and_params():
        input_shape = input_var.shape
321 322
        if num_flatten_dims == -1:
            num_flatten_dims = len(input_shape) - 1
Y
Yu Yang 已提交
323 324 325
        param_shape = [
            reduce(lambda a, b: a * b, input_shape[num_flatten_dims:], 1)
        ] + [size]
Y
ying 已提交
326

327 328 329
        w = helper.create_parameter(
            attr=param_attr, shape=param_shape, dtype=dtype, is_bias=False
        )
X
Xin Pan 已提交
330
        tmp = helper.create_variable_for_type_inference(dtype)
331 332 333 334 335 336
        helper.append_op(
            type="mul",
            inputs={"X": input_var, "Y": w},
            outputs={"Out": tmp},
            attrs={"x_num_col_dims": num_flatten_dims, "y_num_col_dims": 1},
        )
337 338 339 340
        mul_results.append(tmp)

    if len(mul_results) == 1:
        pre_bias = mul_results[0]
341
    else:
X
Xin Pan 已提交
342
        pre_bias = helper.create_variable_for_type_inference(dtype)
343 344 345 346 347 348
        helper.append_op(
            type="sum",
            inputs={"X": mul_results},
            outputs={"Out": pre_bias},
            attrs={"use_mkldnn": False},
        )
349 350 351 352
    # add bias
    pre_activation = helper.append_bias_op(pre_bias, dim_start=num_flatten_dims)
    # add activation
    return helper.append_activation(pre_activation)
Y
Yu Yang 已提交
353 354


T
tangwei12 已提交
355
@deprecated(since="2.0.0", update_to="paddle.nn.functional.embedding")
356 357 358 359 360 361 362 363 364
def embedding(
    input,
    size,
    is_sparse=False,
    is_distributed=False,
    padding_idx=None,
    param_attr=None,
    dtype='float32',
):
365
    r"""
366
    :api_attr: Static Graph
367

368 369 370 371 372 373 374 375 376 377 378 379
    **WARING:** This OP will be deprecated in a future release. This OP requires the
    last dimension of Tensor shape must be equal to 1. It is recommended to use
    fluid. :ref:`api_fluid_embedding` .

    The operator is used to lookup embeddings vector of ids provided by :attr:`input` .
    It automatically constructs a 2D embedding matrix based on the
    input :attr:`size` (vocab_size, emb_size) and :attr:`dtype` .

    This OP requires the last dimension of Tensor shape must be equal to 1. The shape
    of output Tensor is generated by replacing the last dimension of the input Tensor shape
    with emb_size.

380
    **Note:** The id in :attr:`input` must satisfy :math:`0 =< id < size[0]` ,
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
    otherwise the program will throw an exception and exit.

    .. code-block:: text

        Case 1:

        input is a Tensor. padding_idx = -1
            input.data = [[[1], [3]], [[2], [4]], [[4], [127]]]
            input.shape = [3, 2, 1]
        Given size = [128, 16]
        output is a Tensor:
            out.shape = [3, 2, 16]
            out.data = [[[0.129435295, 0.244512452, ..., 0.436322452],
                        [0.345421456, 0.524563927, ..., 0.144534654]],

                        [[0.345249859, 0.124939536, ..., 0.194353745],
                        [0.945345345, 0.435394634, ..., 0.435345365]],
398

399 400 401 402
                        [[0.945345345, 0.435394634, ..., 0.435345365],
                        [0.0,         0.0,         ..., 0.0        ]]]  # padding data
        The input padding_idx is less than 0, it is automatically converted to padding_idx = -1 + 128 = 127
        It will pad all-zero data when ids is 127.
403

404
        Case 2:
405

406 407 408 409 410 411 412 413 414 415 416 417 418 419
        input is a LoDTensor with 1-level LoD. padding_idx = 0
            input.lod = [[2, 3]]
            input.data = [[1], [3], [2], [4], [0]]
            input.shape = [5, 1]
        Given size = [128, 16]
        output is a LoDTensor:
            out.lod = [[2, 3]]
            out.shape = [5, 16]
            out.data = [[0.129435295, 0.244512452, ..., 0.436322452],
                        [0.345421456, 0.524563927, ..., 0.144534654],
                        [0.345249859, 0.124939536, ..., 0.194353745],
                        [0.945345345, 0.435394634, ..., 0.435345365],
                        [0.0,         0.0,         ..., 0.0        ]]  # padding data
        It will pad all-zero data when ids is 0.
Y
Yu Yang 已提交
420 421

    Args:
422 423 424 425 426 427
        input(Variable): A Tensor or LoDTensor with type int64, which contains the id information.
            The last dimension of Tensor shape must be equal to 1. The value of the input id should
            satisfy :math:`0<= id < size[0]` .
        size(tuple|list): The shape of lookup table parameter. It should have two elements which
            indicates the size of the dictionary of embeddings and the size of each embedding vector respectively.
        is_sparse(bool): The flag indicating whether to use sparse update. This parameter only
428
            affects the performance of the backwards gradient update. It is recommended to set
429
            True because sparse update is faster. But some optimizer does not support sparse update,
430
            such as :ref:`api_fluid_optimizer_AdadeltaOptimizer` , :ref:`api_fluid_optimizer_AdamaxOptimizer` ,
431 432 433 434 435
            :ref:`api_fluid_optimizer_DecayedAdagradOptimizer` , :ref:`api_fluid_optimizer_FtrlOptimizer` ,
            :ref:`api_fluid_optimizer_LambOptimizer` and :ref:`api_fluid_optimizer_LarsMomentumOptimizer` .
            In these case, is_sparse must be False. Default: False.
        is_distributed(bool): Whether to store the embedding matrix in a distributed manner. Only used
            in multi-machine distributed CPU training. Default: False.
436
        padding_idx(int|long|None): padding_idx needs to be in the interval [-vocab_size, vocab_size).
437 438 439 440 441 442
            If :math:`padding\_idx < 0`, the :math:`padding\_idx` will automatically be converted
            to :math:`vocab\_size + padding\_idx` . It will output all-zero padding data whenever lookup
            encounters :math:`padding\_idx` in id. And the padding data will not be updated while training.
            If set None, it makes no effect to output. Default: None.
        param_attr(ParamAttr): To specify the weight parameter property. Default: None, which means the
            default weight parameter property is used. See usage for details in :ref:`api_fluid_ParamAttr` . In addition,
443
            user-defined or pre-trained word vectors can be loaded with the :attr:`param_attr` parameter.
444
            The local word vector needs to be transformed into numpy format, and the shape of local word
T
tianshuo78520a 已提交
445
            vector should be consistent with :attr:`size` . Then :ref:`api_fluid_initializer_NumpyArrayInitializer`
446 447 448
            is used to load custom or pre-trained word vectors. See code example 2 for details.
        dtype(str|core.VarDesc.VarType): It refers to the data type of output Tensor.
            It must be float32 or float64. Default: float32.
Y
Yu Yang 已提交
449

450
    Returns:
451
        Variable: Embedding Tensor or LoDTensor mapped by input. The data type is the same as :attr:`dtype` .
Y
Yu Yang 已提交
452

453 454
    Examples:
        .. code-block:: python
Y
Yu Yang 已提交
455

B
bdzhuxiaoning 已提交
456
          import paddle.fluid as fluid
457
          import numpy as np
458 459
          import paddle
          paddle.enable_static()
460

461 462
          data = fluid.data(name='x', shape=[None, 1], dtype='int64')

T
tianshuo78520a 已提交
463
          # example 1
464 465 466 467 468 469 470 471 472
          emb_1 = fluid.embedding(input=data, size=[128, 64])

          # example 2: load custom or pre-trained word vectors
          weight_data = np.random.random(size=(128, 100))  # word vectors with numpy format
          w_param_attrs = fluid.ParamAttr(
              name="emb_weight",
              learning_rate=0.5,
              initializer=fluid.initializer.NumpyArrayInitializer(weight_data),
              trainable=True)
473
          emb_2 = fluid.layers.embedding(input=data, size=(128, 100), param_attr=w_param_attrs, dtype='float32')
Y
Yu Yang 已提交
474 475 476
    """

    helper = LayerHelper('embedding', **locals())
477 478 479 480 481 482 483 484 485
    check_variable_and_dtype(
        input, 'input', ['int64'], 'fluid.layers.embedding'
    )
    check_dtype(
        dtype,
        'dtype',
        ['uint16', 'float16', 'float32', 'float64'],
        'fluid.layers.embedding',
    )
486 487 488 489 490 491 492 493 494

    if is_distributed:
        is_distributed = False
        warnings.warn(
            "is_distributed is go out of use, `fluid.contrib.layers.sparse_embedding` is your needed"
        )

    remote_prefetch = True if is_sparse else False

495 496 497
    w = helper.create_parameter(
        attr=helper.param_attr, shape=size, dtype=dtype, is_bias=False
    )
X
Xin Pan 已提交
498
    tmp = helper.create_variable_for_type_inference(dtype)
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516
    padding_idx = (
        -1
        if padding_idx is None
        else padding_idx
        if padding_idx >= 0
        else (size[0] + padding_idx)
    )
    helper.append_op(
        type='lookup_table',
        inputs={'Ids': input, 'W': w},
        outputs={'Out': tmp},
        attrs={
            'is_sparse': is_sparse,
            'is_distributed': is_distributed,
            'remote_prefetch': remote_prefetch,
            'padding_idx': padding_idx,
        },
    )
Y
Yu Yang 已提交
517 518 519
    return tmp


520 521 522 523 524 525 526 527 528 529 530
def _pull_sparse(
    input,
    size,
    table_id,
    accessor_class,
    name="embedding",
    ctr_label_name="",
    padding_id=0,
    dtype='float32',
    scale_sparse_grad=True,
):
531
    r"""
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
    **Pull Fleet Sparse Layer**

    This layer is used to lookup embeddings of IDs, provided by :attr:`input`, in
    Fleet lookup table. The result of this lookup is the embedding of each ID in the
    :attr:`input`.

    Args:
        input(Variable|list of Variable): Input is a Tensor<int64> Variable, which
            contains the IDs information.
        size(int): The embedding size parameter, which indicates the size of
            each embedding vector respectively.
        table_id(int): the fleet table id of this embedding.
        accessor_class(str): the pslib accessor of the table, default is DownpourCtrAccessor.
        ctr_label_name(str): the layer name of click.
        padding_id(int): the padding id during lookup, default is 0.
        dtype(str): The dtype refers to the data type of output tensor. Only supports
            float32 now.
        scale_sparse_grad(bool): whether to scale sparse gradient with batch size. default
            is True.

    Returns:
        Variable|list of Variable: The tensor variable storing the embeddings of the \
                  supplied inputs.

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid
          data = fluid.layers.data(name='sequence', shape=[1], dtype='int64', lod_level=1)
          emb = fluid.layers.nn._pull_sparse(
              input=data, size=11, table_id=0, accessor_class="DownpourCtrAccessor")
    """
    helper = LayerHelper(name, **locals())
    inputs = helper.multiple_input()
    outs = [helper.create_variable_for_type_inference(dtype)]
    input_names = [i.name for i in inputs]
    attrs = {
        'EmbeddingDim': size,
        'TableId': table_id,
        'AccessorClass': accessor_class,
        'CtrLabelName': ctr_label_name,
        'PaddingId': padding_id,
        'ScaleSparseGrad': scale_sparse_grad,
        'InputNames': input_names,
        # this is only for compatible with embedding op
577
        'is_distributed': True,
578 579
    }
    # this is only for compatible with embedding op
580 581 582 583 584 585 586 587 588
    w, _ = helper.create_or_get_global_variable(
        name=name, shape=[size], dtype=dtype, is_bias=False, persistable=True
    )
    helper.append_op(
        type='pull_sparse',
        inputs={'Ids': inputs, 'W': w},
        outputs={'Out': outs},
        attrs=attrs,
    )
589 590 591 592 593
    if len(outs) == 1:
        return outs[0]
    return outs


594 595 596 597 598 599 600 601 602 603 604
def _pull_sparse_v2(
    input,
    size,
    table_id,
    accessor_class,
    name="embedding",
    ctr_label_name="",
    padding_id=0,
    dtype='float32',
    scale_sparse_grad=True,
):
605
    r"""
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
    **Pull Fleet Sparse Layer**

    This layer is used to lookup embeddings of IDs, provided by :attr:`input`, in
    Fleet lookup table. The result of this lookup is the embedding of each ID in the
    :attr:`input`.

    Args:
        input(Variable|list of Variable): Input is a Tensor<int64> Variable, which
            contains the IDs information.
        size(int): The embedding size parameter, which indicates the size of
            each embedding vector respectively.
        table_id(int): the pslib table id of this embedding.
        accessor_class(str): the fleet accessor of the table, default is DownpourCtrAccessor.
        ctr_label_name(str): the layer name of click.
        padding_id(int): the padding id during lookup, default is 0.
        dtype(str): The dtype refers to the data type of output tensor. Only supports
            float32 now.
        scale_sparse_grad(bool): whether to scale sparse gradient with batch size. default
            is True.

    Returns:
        Variable|list of Variable: The tensor variable storing the embeddings of the \
                  supplied inputs.

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid
          data = fluid.layers.data(name='sequence', shape=[1], dtype='int64', lod_level=1)
          emb = fluid.layers.nn._pull_sparse_v2(
              input=data, size=11, table_id=0, accessor_class="DownpourCtrAccessor")
    """
    helper = LayerHelper(name, **locals())
    inputs = helper.multiple_input()
    outs = [helper.create_variable_for_type_inference(dtype)]
    input_names = [i.name for i in inputs]
    attrs = {
        'EmbeddingDim': size,
        'TableId': table_id,
        'AccessorClass': accessor_class,
        'CtrLabelName': ctr_label_name,
        'PaddingId': padding_id,
        'ScaleSparseGrad': scale_sparse_grad,
        'InputNames': input_names,
        # this is only for compatible with embedding op
651
        'is_distributed': True,
652 653
    }
    # this is only for compatible with embedding op
654 655 656 657 658 659 660 661 662
    w, _ = helper.create_or_get_global_variable(
        name=name, shape=[size], dtype=dtype, is_bias=False, persistable=True
    )
    helper.append_op(
        type='pull_sparse_v2',
        inputs={'Ids': inputs, 'W': w},
        outputs={'Out': outs},
        attrs=attrs,
    )
663
    if len(outs) == 1:
Y
yaoxuefeng 已提交
664 665 666 667
        return outs[0]
    return outs


668 669 670
def _pull_gpups_sparse(
    input, size, dtype='float32', is_distributed=False, is_sparse=False
):
Y
yaoxuefeng 已提交
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703
    r"""
    **Pull GpuPS Sparse Layer**

    This layer is used to lookup embeddings of IDs, provided by :attr:`input`, in
    GpuPS lookup table. The result of this lookup is the embedding of each ID in the
    :attr:`input`.

    Args:
        input(Variable|list of Variable): Input is a Tensor<int64> Variable, which
            contains the IDs information.
        size(int|list of int): The embedding size parameter of each input, which indicates the size of
            each embedding vector respectively.
        dtype(str): The dtype refers to the data type of output tensor. Only supports
	    float32 now.

    Returns:
        Variable|list of Variable: The tensor variable storing the embeddings of the \
                  supplied inputs, whose size are indicated by size respectively.

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid
          slots = []
          data_1 = fluid.layers.data(name='sequence', shape=[1], dtype='int64', lod_level=1)
          slots.append(data_1)
          data_2 = fluid.layers.data(name='sequence', shape=[1], dtype='int64', lod_level=1)
          slots.append(data_2)
          embs = fluid.layers.pull_gpups_sparse(input=slots, size=[11, 35])
    """
    helper = LayerHelper('pull_gpups_sparse', **locals())
    if dtype != 'float32':
        raise ValueError(
704 705 706
            "GpuPS only support float type embedding now, and your type is: "
            + dtype
        )
Y
yaoxuefeng 已提交
707 708 709 710 711 712
    helper.input_dtype()
    inputs = helper.multiple_input()
    outs = [
        helper.create_variable_for_type_inference(dtype)
        for i in range(len(inputs))
    ]
713 714 715 716 717 718 719 720 721 722 723 724 725
    w = helper.create_parameter(
        attr=helper.param_attr, shape=[size[0]], dtype=dtype, is_bias=False
    )
    helper.append_op(
        type='pull_gpups_sparse',
        inputs={'Ids': inputs, 'W': w},
        outputs={'Out': outs},
        attrs={
            'size': size,
            'is_distributed': is_distributed,
            'is_sparse': is_sparse,
        },
    )
Y
yaoxuefeng 已提交
726
    if len(outs) == 1:
727 728 729 730
        return outs[0]
    return outs


731 732 733
def _pull_box_sparse(
    input, size, dtype='float32', is_distributed=False, is_sparse=False
):
734
    r"""
H
hutuxian 已提交
735 736 737 738 739 740 741
    **Pull Box Sparse Layer**

    This layer is used to lookup embeddings of IDs, provided by :attr:`input`, in
    BoxPS lookup table. The result of this lookup is the embedding of each ID in the
    :attr:`input`.

    Args:
742
        input(Variable|list of Variable): Input is a Tensor<int64> Variable, which
H
hutuxian 已提交
743
            contains the IDs information.
744
        size(int): The embedding size parameter, which indicates the size of
H
hutuxian 已提交
745
            each embedding vector respectively.
746
        dtype(str): The dtype refers to the data type of output tensor. Only supports
H
hutuxian 已提交
747 748 749 750 751 752 753 754 755 756 757
	    float32 now.

    Returns:
        Variable|list of Variable: The tensor variable storing the embeddings of the \
                  supplied inputs.

    Examples:
        .. code-block:: python

          import paddle.fluid as fluid
          data = fluid.layers.data(name='sequence', shape=[1], dtype='int64', lod_level=1)
758
          emb = fluid.layers.pull_box_sparse(input=data, size=[11])
H
hutuxian 已提交
759 760 761 762
    """
    helper = LayerHelper('pull_box_sparse', **locals())
    if dtype != 'float32':
        raise ValueError(
763 764 765
            "BoxPS only support float type embedding now, and your type is: "
            + dtype
        )
H
hutuxian 已提交
766 767 768 769 770 771
    helper.input_dtype()
    inputs = helper.multiple_input()
    outs = [
        helper.create_variable_for_type_inference(dtype)
        for i in range(len(inputs))
    ]
772 773 774 775 776 777 778 779 780 781 782 783 784
    w = helper.create_parameter(
        attr=helper.param_attr, shape=[size], dtype=dtype, is_bias=False
    )
    helper.append_op(
        type='pull_box_sparse',
        inputs={'Ids': inputs, 'W': w},
        outputs={'Out': outs},
        attrs={
            'size': size,
            'is_distributed': is_distributed,
            'is_sparse': is_sparse,
        },
    )
H
hutuxian 已提交
785 786 787 788 789
    if len(outs) == 1:
        return outs[0]
    return outs


Y
yuyang18 已提交
790
@templatedoc()
791
def linear_chain_crf(input, label, param_attr=None, length=None):
Y
yuyang18 已提交
792
    """
793 794
    :api_attr: Static Graph

Y
yuyang18 已提交
795 796 797 798 799
    Linear Chain CRF.

    ${comment}

    Args:
800
        input(${emission_type}): ${emission_comment}
Y
yuyang18 已提交
801
        label(${label_type}): ${label_comment}
802
        Length(${length_type}): ${length_comment}
803
        param_attr(ParamAttr): The attribute of the learnable parameter for transition parameter.
Y
yuyang18 已提交
804 805

    Returns:
D
dzhwinter 已提交
806 807
        output(${emission_exps_type}): ${emission_exps_comment} \n
        output(${transition_exps_type}): ${transition_exps_comment} \n
808
        output(${log_likelihood_type}): ${log_likelihood_comment} \n
Y
yuyang18 已提交
809

J
JesseyXujin 已提交
810 811 812
    Examples:
        .. code-block:: python

813 814
            import paddle.fluid as fluid
            import numpy as np
815 816
            import paddle
            paddle.enable_static()
817 818 819 820 821

            #define net structure, using LodTensor
            train_program = fluid.Program()
            startup_program = fluid.Program()
            with fluid.program_guard(train_program, startup_program):
822 823
                input_data = fluid.data(name='input_data', shape=[-1,10], dtype='float32')
                label = fluid.data(name='label', shape=[-1,1], dtype='int')
824 825 826 827 828 829
                emission= fluid.layers.fc(input=input_data, size=10, act="tanh")
                crf_cost = fluid.layers.linear_chain_crf(
                    input=emission,
                    label=label,
                    param_attr=fluid.ParamAttr(
                    name='crfw',
830
                    learning_rate=0.01))
831 832 833
            use_cuda = False
            place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
            exe = fluid.Executor(place)
834
            exe.run(startup_program)
835 836 837 838 839
            #define data, using LoDTensor
            a = fluid.create_lod_tensor(np.random.rand(12,10).astype('float32'), [[3,3,4,2]], place)
            b = fluid.create_lod_tensor(np.array([[1],[1],[2],[3],[1],[1],[1],[3],[1],[1],[1],[1]]),[[3,3,4,2]] , place)
            feed1 = {'input_data':a,'label':b}
            loss= exe.run(train_program,feed=feed1, fetch_list=[crf_cost])
840
            print(loss)
841 842 843 844 845

            #define net structure, using padding
            train_program = fluid.Program()
            startup_program = fluid.Program()
            with fluid.program_guard(train_program, startup_program):
846 847 848
                input_data2 = fluid.data(name='input_data2', shape=[-1,10,10], dtype='float32')
                label2 = fluid.data(name='label2', shape=[-1,10,1], dtype='int')
                label_length = fluid.data(name='length', shape=[-1,1], dtype='int')
849 850 851 852 853 854
                emission2= fluid.layers.fc(input=input_data2, size=10, act="tanh", num_flatten_dims=2)
                crf_cost2 = fluid.layers.linear_chain_crf(
                    input=emission2,
                    label=label2,
                    length=label_length,
                    param_attr=fluid.ParamAttr(
J
JesseyXujin 已提交
855
                     name='crfw',
856 857 858 859 860 861
                     learning_rate=0.01))

            use_cuda = False
            place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(startup_program)
J
JesseyXujin 已提交
862

863 864 865
            #define data, using padding
            cc=np.random.rand(4,10,10).astype('float32')
            dd=np.random.rand(4,10,1).astype('int64')
866
            ll=np.array([[3],[3],[4],[2]])
867 868
            feed2 = {'input_data2':cc,'label2':dd,'length':ll}
            loss2= exe.run(train_program,feed=feed2, fetch_list=[crf_cost2])
869
            print(loss2)
870 871 872 873 874
            #[array([[ 7.8902354],
            #        [ 7.3602567],
            #        [ 10.004011],
            #        [ 5.86721  ]], dtype=float32)]

875 876 877
            #you can use find_var to get transition parameter.
            transition=np.array(fluid.global_scope().find_var('crfw').get_tensor())
            print(transition)
878

Y
yuyang18 已提交
879
    """
880 881 882
    check_variable_and_dtype(
        input, 'input', ['float32', 'float64'], 'linear_chain_crf'
    )
883
    check_variable_and_dtype(label, 'label', ['int64'], 'linear_chain_crf')
Y
Yu Yang 已提交
884
    helper = LayerHelper('linear_chain_crf', **locals())
885
    size = input.shape[2] if length else input.shape[1]
886 887 888 889 890
    transition = helper.create_parameter(
        attr=helper.param_attr,
        shape=[size + 2, size],
        dtype=helper.input_dtype(),
    )
X
Xin Pan 已提交
891
    alpha = helper.create_variable_for_type_inference(
892 893
        dtype=helper.input_dtype()
    )
X
Xin Pan 已提交
894
    emission_exps = helper.create_variable_for_type_inference(
895 896
        dtype=helper.input_dtype()
    )
X
Xin Pan 已提交
897
    transition_exps = helper.create_variable_for_type_inference(
898 899
        dtype=helper.input_dtype()
    )
X
Xin Pan 已提交
900
    log_likelihood = helper.create_variable_for_type_inference(
901 902
        dtype=helper.input_dtype()
    )
903 904 905
    this_inputs = {
        "Emission": [input],
        "Transition": transition,
906
        "Label": [label],
907 908
    }
    if length:
909
        this_inputs['Length'] = [length]
910 911 912 913 914 915 916 917 918 919
    helper.append_op(
        type='linear_chain_crf',
        inputs=this_inputs,
        outputs={
            "Alpha": [alpha],
            "EmissionExps": [emission_exps],
            "TransitionExps": transition_exps,
            "LogLikelihood": log_likelihood,
        },
    )
Y
Yu Yang 已提交
920 921 922 923

    return log_likelihood


W
wopeizl 已提交
924
@templatedoc()
925
def crf_decoding(input, param_attr, label=None, length=None):
W
wopeizl 已提交
926
    """
927
    :api_attr: Static Graph
928

W
wopeizl 已提交
929
    ${comment}
Y
yi.wu 已提交
930

W
wopeizl 已提交
931
    Args:
932
        input(Tensor): ${emission_comment}
Y
yi.wu 已提交
933

934 935
        param_attr (ParamAttr|None): To specify the weight parameter attribute.
            Default: None, which means the default weight parameter property is
936
            used. See usage for details in :ref:`api_paddle_fluid_param_attr_ParamAttr` .
Y
yuyang18 已提交
937

Y
Yibing Liu 已提交
938
        label(${label_type}, optional): ${label_comment}
939

Y
Yibing Liu 已提交
940
        length(${length_type}, optional): ${length_comment}
941

W
wopeizl 已提交
942
    Returns:
943
        Tensor: ${viterbi_path_comment}
Y
yi.wu 已提交
944

W
wopeizl 已提交
945 946
    Examples:
        .. code-block:: python
Y
yi.wu 已提交
947

948 949
           import paddle
           paddle.enable_static()
950 951 952

           # LoDTensor-based example
           num_labels = 10
953 954 955
           feature = paddle.static.data(name='word_emb', shape=[-1, 784], dtype='float32', lod_level=1)
           label = paddle.static.data(name='label', shape=[-1, 1], dtype='int64', lod_level=1)
           emission = paddle.static.nn.fc(feature, size=num_labels)
956

957 958 959 960
           crf_cost = paddle.fluid.layers.linear_chain_crf(input=emission, label=label,
                     param_attr=paddle.ParamAttr(name="crfw"))
           crf_decode = paddle.static.nn.crf_decoding(input=emission,
                     param_attr=paddle.ParamAttr(name="crfw"))
961 962 963

           # Common tensor example
           num_labels, max_len = 10, 20
964 965 966 967
           feature = paddle.static.data(name='word_emb_pad', shape=[-1, max_len, 784], dtype='float32')
           label = paddle.static.data(name='label_pad', shape=[-1, max_len, 1], dtype='int64')
           length = paddle.static.data(name='length', shape=[-1, 1], dtype='int64')
           emission = paddle.static.nn.fc(feature, size=num_labels,
968
                                      num_flatten_dims=2)
969

970 971 972 973
           crf_cost = paddle.fluid.layers.linear_chain_crf(input=emission, label=label, length=length,
                     param_attr=paddle.ParamAttr(name="crfw_pad"))
           crf_decode = paddle.static.nn.crf_decoding(input=emission, length=length,
                     param_attr=paddle.ParamAttr(name="crfw_pad"))
W
wopeizl 已提交
974
    """
975 976 977
    check_variable_and_dtype(
        input, 'input', ['float32', 'float64'], 'crf_decoding'
    )
W
wopeizl 已提交
978 979 980
    helper = LayerHelper('crf_decoding', **locals())
    transition = helper.get_parameter(param_attr.name)
    viterbi_path = helper.create_variable_for_type_inference(
981 982
        dtype=core.VarDesc.VarType.INT64
    )
983 984 985
    inputs = {"Emission": [input], "Transition": transition, "Label": label}
    if length:
        inputs['Length'] = length
986 987 988 989 990
    helper.append_op(
        type='crf_decoding',
        inputs=inputs,
        outputs={"ViterbiPath": [viterbi_path]},
    )
Y
Yu Yang 已提交
991

W
wopeizl 已提交
992
    return viterbi_path
Y
Yu Yang 已提交
993 994


995
@deprecated(since="2.0.0", update_to="paddle.nn.functional.dropout")
996 997 998 999 1000 1001 1002 1003
def dropout(
    x,
    dropout_prob,
    is_test=None,
    seed=None,
    name=None,
    dropout_implementation="downgrade_in_infer",
):
1004
    """
1005

1006 1007 1008 1009
    Computes dropout.

    Drop or keep each element of `x` independently. Dropout is a regularization
    technique for reducing overfitting by preventing neuron co-adaption during
1010
    training. The dropout operator randomly sets (according to the given dropout
1011 1012 1013
    probability) the outputs of some units to zero, while others are remain
    unchanged.

H
haowang101779990 已提交
1014 1015
    dropout op can be removed from the program to make the program more efficient.

1016
    Args:
L
lvmengsi 已提交
1017
        x (Variable): The input tensor variable. The data type is float16 or float32 or float64.
1018
        dropout_prob (float): Probability of setting units to zero.
1019
        is_test (bool): A flag indicating whether it is in test phrase or not.
1020
                        Default None, in dynamic graph, it use global tracer mode; in static graph, it means False.
1021 1022 1023
        seed (int): A Python integer used to create random seeds. If this
                    parameter is set to None, a random seed is used.
                    NOTE: If an integer seed is given, always the same output
L
lvmengsi 已提交
1024
                    units will be dropped. DO NOT use a fixed seed in training.Default: None.
1025 1026
        name (str|None): A name for this layer(optional). If set None, the layer
                         will be named automatically.
H
haowang101779990 已提交
1027 1028
        dropout_implementation(string): ['downgrade_in_infer'(default)|'upscale_in_train']

P
phlrain 已提交
1029
                                        1. downgrade_in_infer(default), downgrade the outcome at inference
H
haowang101779990 已提交
1030 1031

                                           - train: out = input * mask
C
ceci3 已提交
1032
                                           - inference: out = input * (1.0 - dropout_prob)
H
haowang101779990 已提交
1033 1034 1035

                                           (mask is a tensor same shape with input, value is 0 or 1
                                           ratio of 0 is dropout_prob)
P
phlrain 已提交
1036
                                        2. upscale_in_train, upscale the outcome at training time
1037

H
haowang101779990 已提交
1038 1039
                                           - train: out = input * mask / ( 1.0 - dropout_prob )
                                           - inference: out = input
P
phlrain 已提交
1040

H
haowang101779990 已提交
1041 1042
                                           (mask is a tensor same shape with input, value is 0 or 1
                                           ratio of 0 is dropout_prob)
1043

M
minqiyang 已提交
1044

1045
    Returns:
L
lvmengsi 已提交
1046
        A Variable holding Tensor representing the dropout, has same shape and data type with `x`.
1047 1048

    Examples:
1049

1050 1051
        .. code-block:: python

1052
            import paddle
1053
            import paddle.fluid as fluid
1054

1055
            paddle.enable_static()
L
lvmengsi 已提交
1056
            x = fluid.data(name="data", shape=[None, 32, 32], dtype="float32")
T
tianshuo78520a 已提交
1057
            dropped = fluid.layers.dropout(x, dropout_prob=0.5)
1058
    """
1059 1060
    if not isinstance(dropout_prob, (float, int, Variable)):
        raise TypeError(
1061 1062
            "dropout_prob argument should be a number(int|float) or Variable"
        )
1063
    # fast return for p == 0
1064
    if isinstance(dropout_prob, (int, float)) and dropout_prob == 0:
1065
        return x
1066

J
Jiabin Yang 已提交
1067
    if _non_static_mode():
1068 1069 1070
        if (
            seed is None or seed == 0
        ) and default_main_program().random_seed != 0:
1071
            seed = default_main_program().random_seed
1072 1073
        if is_test is None:
            is_test = not _dygraph_tracer()._train_mode
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
        out, mask = _legacy_C_ops.dropout(
            x,
            'dropout_prob',
            dropout_prob,
            'is_test',
            is_test,
            'fix_seed',
            seed is not None,
            'seed',
            seed if seed is not None else 0,
            'dropout_implementation',
            dropout_implementation,
        )
1087
        return out
1088

W
wanghuancoder 已提交
1089 1090 1091
    def get_attrs(prog, dropout_prob, is_test, seed):
        if (seed is None or seed == 0) and prog.random_seed != 0:
            seed = prog.random_seed
1092 1093
        if isinstance(dropout_prob, Variable) and not dropout_prob.shape != [1]:
            raise TypeError(
1094 1095 1096 1097
                "Required dropout_prob.shape == [1] if type(dropout_prob) is Variable, but received dropout_prob.shape = {}".format(
                    dropout_prob.shape
                )
            )
W
wanghuancoder 已提交
1098 1099 1100 1101 1102 1103 1104 1105 1106
        attrs = {
            'dropout_prob': dropout_prob,
            'is_test': is_test,
            'fix_seed': seed is not None,
            'seed': seed if seed is not None else 0,
            'dropout_implementation': dropout_implementation,
        }
        return attrs

F
fengjiayi 已提交
1107
    helper = LayerHelper('dropout', **locals())
1108 1109 1110
    check_variable_and_dtype(
        x, 'x', ['float16', 'float32', 'float64'], 'dropout'
    )
1111

X
Xin Pan 已提交
1112 1113
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
    mask = helper.create_variable_for_type_inference(
1114 1115
        dtype=core.VarDesc.VarType.UINT8, stop_gradient=True
    )
C
chengduo 已提交
1116

1117
    attrs = get_attrs(helper.main_program, dropout_prob, is_test, seed)
C
chengduo 已提交
1118

1119 1120 1121 1122 1123 1124
    helper.append_op(
        type='dropout',
        inputs={'X': [x]},
        outputs={'Out': [out], 'Mask': [mask]},
        attrs=attrs,
    )
1125 1126 1127
    return out


1128
@deprecated(since="2.0.0", update_to="paddle.nn.functional.softmax")
1129
def softmax(input, use_cudnn=True, name=None, axis=-1):
1130
    r"""
1131
    This operator implements the softmax layer. The calculation process is as follows:
1132

1133
    1. The dimension :attr:`axis` of the ``input`` will be permuted to the last.
1134

1135 1136 1137 1138 1139 1140 1141
    2. Then the input tensor will be logically flattened to a 2-D matrix. The matrix's
    second dimension(row length) is the same as the dimension :attr:`axis` of the input
    tensor, and the first dimension(column length) is the product of all other
    dimensions of the input tensor. For each row of the matrix, the softmax operator
    squashes the K-dimensional(K is the width of the matrix, which is also the size
    of the input tensor's dimension :attr:`axis`) vector of arbitrary real values to a
    K-dimensional vector of real values in the range [0, 1] that add up to 1.
1142

1143
    3. After the softmax operation is completed, the inverse operations of steps 1 and 2
1144
    are performed to restore the two-dimensional matrix to the same dimension as the ``input``.
1145

1146 1147 1148 1149 1150
    It computes the exponential of the given dimension and the sum of exponential
    values of all the other dimensions in the K-dimensional vector input.
    Then the ratio of the exponential of the given dimension and the sum of
    exponential values of all the other dimensions is the output of the softmax
    operator.
1151

1152
    For each row :math:`i` and each column :math:`j` in the matrix, we have:
1153

1154
    .. math::
1155

N
Noel 已提交
1156
        Out[i, j] = \\frac{\\exp(X[i, j])}{\\sum_j(exp(X[i, j])}
1157

1158
    Example:
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202

    .. code-block:: text

        Case 1:
          Input:
            X.shape = [2, 3, 4]
            X.data = [[[2.0, 3.0, 4.0, 5.0],
                       [3.0, 4.0, 5.0, 6.0],
                       [7.0, 8.0, 8.0, 9.0]],
                      [[1.0, 2.0, 3.0, 4.0],
                       [5.0, 6.0, 7.0, 8.0],
                       [6.0, 7.0, 8.0, 9.0]]]

          Attrs:
            axis = -1

          Output:
            Out.shape = [2, 3, 4]
            Out.data = [[[0.0320586 , 0.08714432, 0.23688282, 0.64391426],
                         [0.0320586 , 0.08714432, 0.23688282, 0.64391426],
                         [0.07232949, 0.19661193, 0.19661193, 0.53444665]],
                        [[0.0320586 , 0.08714432, 0.23688282, 0.64391426],
                         [0.0320586 , 0.08714432, 0.23688282, 0.64391426],
                         [0.0320586 , 0.08714432, 0.23688282, 0.64391426]]]

        Case 2:
          Input:
            X.shape = [2, 3, 4]
            X.data = [[[2.0, 3.0, 4.0, 5.0],
                       [3.0, 4.0, 5.0, 6.0],
                       [7.0, 8.0, 8.0, 9.0]],
                      [[1.0, 2.0, 3.0, 4.0],
                       [5.0, 6.0, 7.0, 8.0],
                       [6.0, 7.0, 8.0, 9.0]]]
          Attrs:
            axis = 1

          Output:
            Out.shape = [2, 3, 4]
            Out.data = [[[0.00657326, 0.00657326, 0.01714783, 0.01714783],
                         [0.01786798, 0.01786798, 0.04661262, 0.04661262],
                         [0.97555875, 0.97555875, 0.93623955, 0.93623955]],
                        [[0.00490169, 0.00490169, 0.00490169, 0.00490169],
                         [0.26762315, 0.26762315, 0.26762315, 0.26762315],
1203
                         [0.72747516, 0.72747516, 0.72747516, 0.72747516]]]
1204

Q
qiaolongfei 已提交
1205
    Args:
N
Noel 已提交
1206
        input (Tensor): The input tensor. A multi-dimension ``Tensor`` with type float32 or float64.
1207
        use_cudnn (bool, optional): Use cudnn kernel or not, it is valid only when the cudnn \
G
GaoWei8 已提交
1208
            library is installed. To improve performance, set use_cudnn to True by default.
1209
        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` . Default: None.
C
chengduo 已提交
1210
            will be named automatically. Default: None.
1211
        axis (int, optional): The index of dimension to perform softmax calculations, it should
D
dengkaipeng 已提交
1212
            be in range :math:`[-1, rank - 1]`, while :math:`rank` is the rank of
N
Noel 已提交
1213
            input tensor. Default: -1. -1 means the last dimension.
Q
qiaolongfei 已提交
1214 1215

    Returns:
N
Noel 已提交
1216
        Tensor: ``Tensor`` indicates the output of softmax. The data type and shape are the same as ``input`` .
Q
qiaolongfei 已提交
1217 1218 1219 1220 1221

    Examples:

        .. code-block:: python

N
Noel 已提交
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
            import paddle
            import paddle.nn.functional as F

            x = paddle.to_tensor([[[2.0, 3.0, 4.0, 5.0],
                                [3.0, 4.0, 5.0, 6.0],
                                [7.0, 8.0, 8.0, 9.0]],
                                [[1.0, 2.0, 3.0, 4.0],
                                [5.0, 6.0, 7.0, 8.0],
                                [6.0, 7.0, 8.0, 9.0]]], dtype='float32')
            y = F.softmax(x, axis=1)
            print(y)
            # [[[0.00657326, 0.00657326, 0.01714783, 0.01714783],
            #   [0.01786798, 0.01786798, 0.04661262, 0.04661262],
            #   [0.97555870, 0.97555870, 0.93623954, 0.93623954]],
            #  [[0.00490169, 0.00490169, 0.00490169, 0.00490169],
            #   [0.26762316, 0.26762316, 0.26762316, 0.26762316],
            #   [0.72747517, 0.72747517, 0.72747517, 0.72747517]]]
Q
qiaolongfei 已提交
1239 1240

    """
1241

H
hong 已提交
1242
    if in_dygraph_mode():
1243
        return _C_ops.softmax(input, axis)
H
hong 已提交
1244

J
Jiabin Yang 已提交
1245
    if _non_static_mode():
1246 1247 1248
        return _legacy_C_ops.softmax(
            input, 'axis', axis, 'use_cudnn', use_cudnn
        )
1249 1250 1251

    inputs = {"X": [input]}
    attrs = {"axis": axis, "use_cudnn": use_cudnn}
1252

1253
    helper = LayerHelper('softmax', **locals())
1254 1255 1256
    check_variable_and_dtype(
        input, 'input/x', ['float16', 'float32', 'float64'], 'softmax'
    )
1257

1258
    dtype = helper.input_dtype()
X
Xin Pan 已提交
1259
    softmax_out = helper.create_variable_for_type_inference(dtype)
1260 1261 1262 1263 1264 1265
    helper.append_op(
        type="softmax",
        inputs={"X": input},
        outputs={"Out": softmax_out},
        attrs=attrs,
    )
1266 1267 1268
    return softmax_out


1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
def conv2d(
    input,
    num_filters,
    filter_size,
    stride=1,
    padding=0,
    dilation=1,
    groups=None,
    param_attr=None,
    bias_attr=None,
    use_cudnn=True,
    act=None,
    name=None,
    data_format="NCHW",
):
1284
    r"""
1285 1286
    :api_attr: Static Graph

C
chengduoZH 已提交
1287
    The convolution2D layer calculates the output based on the input, filter
T
tensor-tang 已提交
1288
    and strides, paddings, dilations, groups parameters. Input and
L
liym27 已提交
1289
    Output are in NCHW or NHWC format, where N is batch size, C is the number of
1290
    channels, H is the height of the feature, and W is the width of the feature.
T
tensor-tang 已提交
1291 1292 1293 1294 1295 1296
    Filter is in MCHW format, where M is the number of output image channels,
    C is the number of input image channels, H is the height of the filter,
    and W is the width of the filter. If the groups is greater than 1,
    C will equal the number of input image channels divided by the groups.
    Please refer to UFLDL's `convolution
    <http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/>`_
1297
    for more details.
1298 1299 1300
    If bias attribution and activation type are provided, bias is added to the
    output of the convolution, and the corresponding activation function is
    applied to the final result.
C
chengduoZH 已提交
1301

1302
    For each input :math:`X`, the equation is:
C
refine  
chengduoZH 已提交
1303

C
chengduoZH 已提交
1304 1305
    .. math::

C
refine  
chengduoZH 已提交
1306
        Out = \sigma (W \\ast X + b)
C
chengduoZH 已提交
1307

T
tensor-tang 已提交
1308
    Where:
C
chengduoZH 已提交
1309

L
liym27 已提交
1310
    * :math:`X`: Input value, a tensor with NCHW or NHWC format.
1311 1312 1313 1314
    * :math:`W`: Filter value, a tensor with MCHW format.
    * :math:`\\ast`: Convolution operation.
    * :math:`b`: Bias value, a 2-D tensor with shape [M, 1].
    * :math:`\\sigma`: Activation function.
T
tensor-tang 已提交
1315
    * :math:`Out`: Output value, the shape of :math:`Out` and :math:`X` may be different.
C
chengduoZH 已提交
1316 1317 1318

    Example:

1319 1320
        - Input:

W
weixing02 已提交
1321
          Input shape: :math:`(N, C_{in}, H_{in}, W_{in})`
C
refine  
chengduoZH 已提交
1322

W
weixing02 已提交
1323
          Filter shape: :math:`(C_{out}, C_{in}, H_f, W_f)`
C
refine  
chengduoZH 已提交
1324

1325
        - Output:
T
tensor-tang 已提交
1326

W
weixing02 已提交
1327
          Output shape: :math:`(N, C_{out}, H_{out}, W_{out})`
C
refine  
chengduoZH 已提交
1328

C
chengduoZH 已提交
1329
        Where
1330 1331

        .. math::
C
chengduoZH 已提交
1332

W
weixing02 已提交
1333 1334
            H_{out}&= \\frac{(H_{in} + 2 * paddings[0] - (dilations[0] * (H_f - 1) + 1))}{strides[0]} + 1 \\\\
            W_{out}&= \\frac{(W_{in} + 2 * paddings[1] - (dilations[1] * (W_f - 1) + 1))}{strides[1]} + 1
C
chengduoZH 已提交
1335 1336

    Args:
1337
        input (Tensor): The input is 4-D Tensor with shape [N, C, H, W], the data type
L
lvmengsi 已提交
1338
            of input is float16 or float32 or float64.
T
tensor-tang 已提交
1339
        num_filters(int): The number of filter. It is as same as the output
1340
            image channel.
1341 1342
        filter_size (int|tuple): The filter size. If filter_size
            is a tuple, it must contain two integers, (filter_size_height,
L
lvmengsi 已提交
1343 1344
            filter_size_width). Otherwise, filter_size_height = filter_size_width =\
            filter_size.
1345 1346
        stride (int|tuple): The stride size. It means the stride in convolution.
            If stride is a tuple, it must contain two integers, (stride_height, stride_width).
L
lvmengsi 已提交
1347 1348
            Otherwise, stride_height = stride_width = stride. Default: stride = 1.
        padding (string|int|list|tuple): The padding size. It means the number of zero-paddings
T
tianshuo78520a 已提交
1349
            on both sides for each dimension.If `padding` is a string, either 'VALID' or
L
liym27 已提交
1350 1351
            'SAME' which is the padding algorithm. If padding size is a tuple or list,
            it could be in three forms: `[pad_height, pad_width]` or
1352 1353
            `[pad_height_top, pad_height_bottom, pad_width_left, pad_width_right]`, and when
            `data_format` is `"NCHW"`, `padding` can be in the form `[[0,0], [0,0],
L
lvmengsi 已提交
1354
            [pad_height_top, pad_height_bottom], [pad_width_left, pad_width_right]]`.
L
liym27 已提交
1355 1356 1357
            when `data_format` is `"NHWC"`, `pool_padding` can be in the form
            `[[0,0], [pad_height_top, pad_height_bottom], [pad_width_left, pad_width_right], [0,0]]`.
            Default: padding = 0.
L
lvmengsi 已提交
1358
        dilation (int|tuple): The dilation size. It means the spacing between the kernel
1359 1360
            points. If dilation is a tuple, it must contain two integers, (dilation_height,
            dilation_width). Otherwise, dilation_height = dilation_width = dilation.
L
lvmengsi 已提交
1361
            Default: dilation = 1.
1362 1363 1364 1365
        groups (int): The groups number of the Conv2d Layer. According to grouped
            convolution in Alex Krizhevsky's Deep CNN paper: when group=2,
            the first half of the filters is only connected to the first half
            of the input channels, while the second half of the filters is only
C
chengduo 已提交
1366 1367 1368 1369 1370
            connected to the second half of the input channels. Default: groups=1.
        param_attr (ParamAttr|None): The parameter attribute for learnable parameters/weights
            of conv2d. If it is set to None or one attribute of ParamAttr, conv2d
            will create ParamAttr as param_attr. If the Initializer of the param_attr
            is not set, the parameter is initialized with :math:`Normal(0.0, std)`,
H
haowang101779990 已提交
1371
            and the :math:`std` is :math:`(\\frac{2.0 }{filter\_elem\_num})^{0.5}`. Default: None.
C
chengduo 已提交
1372 1373 1374 1375 1376
        bias_attr (ParamAttr|bool|None): The parameter attribute for the bias of conv2d.
            If it is set to False, no bias will be added to the output units.
            If it is set to None or one attribute of ParamAttr, conv2d
            will create ParamAttr as bias_attr. If the Initializer of the bias_attr
            is not set, the bias is initialized zero. Default: None.
1377 1378
        use_cudnn (bool): Use cudnn kernel or not, it is valid only when the cudnn
            library is installed. Default: True
C
chengduo 已提交
1379 1380
        act (str): Activation type, if it is set to None, activation is not appended.
            Default: None
1381 1382
        name(str|None): For detailed information, please refer
           to :ref:`api_guide_Name`. Usually name is no need to set and
L
lvmengsi 已提交
1383
           None by default.
1384
        data_format (str, optional): Specify the data format of the input, and the data format of the output
1385
            will be consistent with that of the input. An optional string from: `"NCHW"`, `"NHWC"`.
L
liym27 已提交
1386 1387
            The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
            `[batch_size, input_channels, input_height, input_width]`.
C
chengduoZH 已提交
1388 1389

    Returns:
1390 1391 1392
        A Tensor representing the conv2d, whose data type is the
        same with input. If act is None, the tensor storing the convolution
        result, and if act is not None, the tensor storing convolution
L
lvmengsi 已提交
1393
        and non-linearity activation result.
C
refine  
chengduoZH 已提交
1394

1395 1396 1397 1398 1399
    Raises:
        ValueError: If the type of `use_cudnn` is not bool.
        ValueError: If `data_format` is not "NCHW" or "NHWC".
        ValueError: If the channel dimmention of the input is less than or equal to zero.
        ValueError: If `padding` is a string, but not "SAME" or "VALID".
1400
        ValueError: If `padding` is a tuple, but the element corresponding to the input's batch size is not 0
1401 1402 1403 1404 1405 1406 1407
            or the element corresponding to the input's channel is not 0.
        ShapeError: If the input is not 4-D Tensor.
        ShapeError: If the input's dimension size and filter's dimension size not equal.
        ShapeError: If the dimension size of input minus the size of `stride` is not 2.
        ShapeError: If the number of input channels is not equal to filter's channels * groups.
        ShapeError: If the number of output channels is not be divided by groups.

C
chengduoZH 已提交
1408 1409 1410
    Examples:
        .. code-block:: python

1411 1412
          import paddle
          paddle.enable_static()
1413

1414 1415 1416
          data = paddle.static.data(name='data', shape=[None, 3, 32, 32], dtype='float32')
          conv2d = paddle.static.nn.conv2d(input=data, num_filters=2, filter_size=3, act="relu")
          print(conv2d.shape) # [-1, 2, 30, 30]
Y
Yu Yang 已提交
1417 1418
    """

1419 1420 1421
    check_variable_and_dtype(
        input, 'input', ['float16', 'float32', 'float64'], 'conv2d'
    )
1422
    if len(input.shape) != 4:
1423 1424 1425 1426
        raise ValueError(
            "Input size should be 4, "
            "but received {}".format(len(input.shape))
        )
1427
    num_channels = input.shape[1]
L
liym27 已提交
1428
    if not isinstance(use_cudnn, bool):
1429 1430 1431 1432
        raise ValueError(
            "Attr(use_cudnn) should be True or False. Received "
            "Attr(use_cudnn): %s. " % str(use_cudnn)
        )
L
liym27 已提交
1433 1434 1435 1436

    if data_format not in ["NCHW", "NHWC"]:
        raise ValueError(
            "Attr(data_format) should be 'NCHW' or 'NHWC'. Received "
1437 1438
            "Attr(data_format): %s." % str(data_format)
        )
L
liym27 已提交
1439

1440
    channel_last = data_format == "NHWC"
L
liym27 已提交
1441 1442 1443 1444
    num_channels = input.shape[3] if channel_last else input.shape[1]
    if num_channels < 0:
        raise ValueError(
            "The channel dimmention of the input(%s) should be defined. "
1445 1446
            "Received: %s." % (str(input.shape), str(num_channels))
        )
C
chengduo 已提交
1447
    assert param_attr is not False, "param_attr should not be False here."
L
liym27 已提交
1448

1449 1450 1451
    if groups is None:
        num_filter_channels = num_channels
    elif groups <= 0:
1452 1453
        raise ValueError(
            "the groups of input must be greater than 0, "
1454 1455
            "but received the groups of input is {}".format(groups)
        )
1456 1457 1458 1459 1460
    else:
        if num_channels % groups != 0:
            raise ValueError(
                "the channel of input must be divisible by groups,"
                "received: the channel of input is {}, the shape of input is {}"
1461 1462
                ", the groups is {}".format(num_channels, input.shape, groups)
            )
1463 1464
        num_filter_channels = num_channels // groups

1465
    l_type = 'conv2d'
1466 1467 1468 1469 1470
    if (
        num_channels == groups
        and num_filters % num_channels == 0
        and not use_cudnn
    ):
1471
        l_type = 'depthwise_conv2d'
1472

1473 1474 1475 1476 1477
    if (
        num_channels == groups
        and num_filters % num_channels == 0
        and core.is_compiled_with_rocm()
    ):
1478 1479
        l_type = 'depthwise_conv2d'

1480 1481
    # NPU only supports depthwise_conv2d when  "input_channel = output_channel = groups"
    if core.is_compiled_with_npu():
1482
        if num_channels == groups and num_channels == num_filters:
1483 1484 1485 1486
            l_type = 'depthwise_conv2d'
        else:
            l_type = 'conv2d'

1487 1488 1489
    helper = LayerHelper(l_type, **locals())
    dtype = helper.input_dtype()

C
chengduoZH 已提交
1490 1491
    filter_size = utils.convert_to_list(filter_size, 2, 'filter_size')
    stride = utils.convert_to_list(stride, 2, 'stride')
1492
    dilation = utils.convert_to_list(dilation, 2, 'dilation')
C
chengduoZH 已提交
1493

L
liym27 已提交
1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505
    # padding
    def _update_padding(padding, data_format):
        def is_list_or_tuple(ele):
            if isinstance(ele, list) or isinstance(ele, tuple):
                return True
            return False

        if is_list_or_tuple(padding) and len(padding) == 4:
            if is_list_or_tuple(padding[0]) and (data_format == "NCHW"):
                if not (padding[0] == [0, 0] and padding[1] == [0, 0]):
                    raise ValueError(
                        "Non-zero padding(%s) in the batch or channel dimensions "
1506 1507
                        "is not supported." % str(padding)
                    )
L
liym27 已提交
1508 1509 1510 1511 1512 1513
                padding = padding[2:4]
                padding = [ele for a_list in padding for ele in a_list]
            elif is_list_or_tuple(padding[0]) and (data_format == "NHWC"):
                if not (padding[0] == [0, 0] and padding[3] == [0, 0]):
                    raise ValueError(
                        "Non-zero padding(%s) in the batch or channel dimensions "
1514 1515
                        "is not supported." % str(padding)
                    )
L
liym27 已提交
1516 1517 1518
                padding = padding[1:3]
                padding = [ele for a_list in padding for ele in a_list]
            padding = utils.convert_to_list(padding, 4, 'padding')
1519 1520 1521
            if utils._is_symmetric_padding(padding, 2):
                padding = [padding[0], padding[2]]

L
liym27 已提交
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531
        else:
            padding = utils.convert_to_list(padding, 2, 'padding')

        return padding

    padding_algorithm = "EXPLICIT"
    if isinstance(padding, str):
        padding = padding.upper()
        if padding not in ["SAME", "VALID"]:
            raise ValueError(
1532 1533 1534
                "Unknown padding: '%s'. It can only be 'SAME' or 'VALID'."
                % str(padding)
            )
L
liym27 已提交
1535 1536
        if padding == "VALID":
            padding_algorithm = "VALID"
1537
            padding = [0, 0]
L
liym27 已提交
1538 1539
        elif padding == "SAME":
            padding_algorithm = "SAME"
1540
            padding = [0, 0]
L
liym27 已提交
1541 1542

    padding = _update_padding(padding, data_format)
Y
Yu Yang 已提交
1543

M
minqiyang 已提交
1544
    filter_shape = [num_filters, int(num_filter_channels)] + filter_size
Y
Yu Yang 已提交
1545 1546

    def _get_default_param_initializer():
C
chengduo 已提交
1547
        filter_elem_num = filter_size[0] * filter_size[1] * num_channels
1548 1549 1550 1551
        if filter_elem_num <= 0:
            raise ValueError(
                "Invalid filter number, excepted number is larger than 0, but"
                " received {}, please check the input shape and "
1552 1553 1554
                "filter size.".format(filter_elem_num)
            )
        std = (2.0 / filter_elem_num) ** 0.5
Y
Yu Yang 已提交
1555 1556 1557 1558 1559 1560
        return Normal(0.0, std, 0)

    filter_param = helper.create_parameter(
        attr=helper.param_attr,
        shape=filter_shape,
        dtype=dtype,
1561 1562
        default_initializer=_get_default_param_initializer(),
    )
Y
Yu Yang 已提交
1563

X
Xin Pan 已提交
1564
    pre_bias = helper.create_variable_for_type_inference(dtype)
Y
Yu Yang 已提交
1565

1566 1567 1568 1569 1570 1571
    if (
        core.is_compiled_with_cuda()
        and paddle.fluid.get_flags("FLAGS_conv2d_disable_cudnn")[
            "FLAGS_conv2d_disable_cudnn"
        ]
    ):
1572 1573
        use_cudnn = False

1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
    helper.append_op(
        type=l_type,
        inputs={
            'Input': input,
            'Filter': filter_param,
        },
        outputs={"Output": pre_bias},
        attrs={
            'strides': stride,
            'paddings': padding,
            'dilations': dilation,
            'groups': groups,
            'use_cudnn': use_cudnn,
            'use_mkldnn': False,
            'fuse_relu_before_depthwise_conv': False,
            "padding_algorithm": padding_algorithm,
            "data_format": data_format,
        },
    )
Y
Yu Yang 已提交
1593

1594 1595 1596 1597
    if data_format == 'NCHW':
        pre_act = helper.append_bias_op(pre_bias, dim_start=1, dim_end=2)
    else:
        pre_act = helper.append_bias_op(pre_bias, dim_start=3, dim_end=4)
Y
Yu Yang 已提交
1598 1599 1600 1601

    return helper.append_activation(pre_act)


F
fengjiayi 已提交
1602
@templatedoc()
1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615
def pool2d(
    input,
    pool_size=-1,
    pool_type="max",
    pool_stride=1,
    pool_padding=0,
    global_pooling=False,
    use_cudnn=True,
    ceil_mode=False,
    name=None,
    exclusive=True,
    data_format="NCHW",
):
Y
Yu Yang 已提交
1616
    """
1617

F
fengjiayi 已提交
1618
    ${comment}
1619 1620

    Args:
K
Kaipeng Deng 已提交
1621 1622 1623 1624 1625
        input (Variable): The input tensor of pooling operator which is a 4-D tensor with
                          shape [N, C, H, W]. The format of input tensor is `"NCHW"` or
                          `"NHWC"`, where `N` is batch size, `C` is the number of channels,
                          `H` is the height of the feature, and `W` is the width of the
                          feature. The data type if float32 or float64.
J
JiabinYang 已提交
1626
        pool_size (int|list|tuple): The pool kernel size. If pool kernel size is a tuple or list,
J
JiabinYang 已提交
1627 1628
            it must contain two integers, (pool_size_Height, pool_size_Width).
            Otherwise, the pool kernel size will be a square of an int.
F
fengjiayi 已提交
1629
        pool_type: ${pooling_type_comment}
J
JiabinYang 已提交
1630 1631 1632
        pool_stride (int|list|tuple): The pool stride size. If pool stride size is a tuple or list,
            it must contain two integers, (pool_stride_Height, pool_stride_Width).
            Otherwise, the pool stride size will be a square of an int.
1633 1634 1635 1636 1637 1638 1639
        pool_padding (string|int|list|tuple): The pool padding. If `pool_padding` is a string, either 'VALID' or
            'SAME' which is the padding algorithm. If pool padding size is a tuple or list,
            it could be in three forms: `[pad_height, pad_width]` or
            `[pad_height_top, pad_height_bottom, pad_width_left, pad_width_right]`, and when `data_format` is `"NCHW"`,
            `pool_padding` can be in the form `[[0,0], [0,0], [pad_height_top, pad_height_bottom], [pad_width_left, pad_width_right]]`.
            when `data_format` is `"NHWC"`, `pool_padding` can be in the form
            `[[0,0], [pad_height_top, pad_height_bottom], [pad_width_left, pad_width_right], [0,0]]`.
J
JiabinYang 已提交
1640
            Otherwise, the pool padding size will be a square of an int.
1641 1642 1643
        global_pooling (bool): ${global_pooling_comment}
        use_cudnn (bool): ${use_cudnn_comment}
        ceil_mode (bool): ${ceil_mode_comment}
K
Kaipeng Deng 已提交
1644 1645 1646
        name(str, optional): For detailed information, please refer
                             to :ref:`api_guide_Name`. Usually name is no need to set and
                             None by default.
1647
        exclusive (bool): Whether to exclude padding points in average pooling
1648
                          mode, default is `true`.
1649
        data_format (string): The data format of the input and output data. An optional string from: `"NCHW"`, `"NHWC"`.
1650 1651
                The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
                `[batch_size, input_channels, input_height, input_width]`.
F
fengjiayi 已提交
1652

1653
    Returns:
K
Kaipeng Deng 已提交
1654
        Variable: The output tensor of pooling result. The data type is same as input tensor.
F
fengjiayi 已提交
1655 1656

    Raises:
1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668
        ValueError: If `pool_type` is not "max" nor "avg".
        ValueError: If `global_pooling` is False and `pool_size` is -1.
        TypeError: If `use_cudnn` is not a bool value.
        ValueError: If `data_format` is not "NCHW" or "NHWC".
        ValueError: If `pool_padding` is a string, but not "SAME" or "VALID".
        ValueError: If `pool_padding` is "VALID", but `ceil_mode` is True.
        ValueError: If `pool_padding` is a list or tuple, but the elements in the batch or channel dimensions are non-zero.
        ShapeError: If the input is not a 4-D or 5-D Tensor.
        ShapeError: If the dimension of input minus the size of `pool_stride` is not 2.
        ShapeError: If the size of `pool_size` and `pool_stride` is not equal.
        ShapeError: If the output's shape calculated is not greater than 0.

F
fengjiayi 已提交
1669 1670 1671 1672 1673

    Examples:

        .. code-block:: python

1674
          import paddle.fluid as fluid
1675 1676 1677
          import paddle

          paddle.enable_static()
1678

K
Kaipeng Deng 已提交
1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703
          data = fluid.data(name='data', shape=[None, 3, 32, 32], dtype='float32')

          # max pool2d
          pool2d = fluid.layers.pool2d(
            input = data,
            pool_size = 2,
            pool_type = "max",
            pool_stride = 1,
            global_pooling=False)

          # average pool2d
          pool2d = fluid.layers.pool2d(
            input = data,
            pool_size = 2,
            pool_type = "avg",
            pool_stride = 1,
            global_pooling=False)

          # global average pool2d
          pool2d = fluid.layers.pool2d(
            input = data,
            pool_size = 2,
            pool_type = "avg",
            pool_stride = 1,
            global_pooling=True)
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721

          # Attr(pool_padding) is a list with 4 elements, Attr(data_format) is "NCHW".
          out_1 = fluid.layers.pool2d(
            input = data,
            pool_size = 3,
            pool_type = "avg",
            pool_stride = 1,
            pool_padding = [1, 2, 1, 0],
            data_format = "NCHW")

          # Attr(pool_padding) is a string, Attr(data_format) is "NCHW".
          out_2 = fluid.layers.pool2d(
            input = data,
            pool_size = 3,
            pool_type = "avg",
            pool_stride = 1,
            pool_padding = "VALID",
            data_format = "NCHW")
Y
Yu Yang 已提交
1722 1723 1724
    """
    if pool_type not in ["max", "avg"]:
        raise ValueError(
1725
            "Unknown Attr(pool_type): '%s'. It can only be 'max' or 'avg'.",
1726 1727
            str(pool_type),
        )
C
chengduoZH 已提交
1728

C
chengduoZH 已提交
1729 1730
    if global_pooling is False and pool_size == -1:
        raise ValueError(
1731
            "When Attr(global_pooling) is False, Attr(pool_size) must be passed "
1732 1733
            "and be a valid value. Received pool_size: %s." % str(pool_size)
        )
1734 1735

    if not isinstance(use_cudnn, bool):
1736 1737 1738 1739
        raise TypeError(
            "Attr(use_cudnn) should be True or False. Received "
            "Attr(use_cudnn): %s." % str(use_cudnn)
        )
1740 1741 1742 1743

    if data_format not in ["NCHW", "NHWC"]:
        raise ValueError(
            "Attr(data_format) should be 'NCHW' or 'NHWC'. Received "
1744 1745
            "Attr(data_format): %s." % str(data_format)
        )
C
chengduoZH 已提交
1746

C
chengduoZH 已提交
1747 1748 1749
    pool_size = utils.convert_to_list(pool_size, 2, 'pool_size')
    pool_stride = utils.convert_to_list(pool_stride, 2, 'pool_stride')

1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760
    def update_padding(padding, data_format):
        def is_list_or_tuple(ele):
            if isinstance(ele, list) or isinstance(ele, tuple):
                return True
            return False

        if is_list_or_tuple(padding) and len(padding) == 4:
            if is_list_or_tuple(padding[0]) and (data_format == "NCHW"):
                if not (padding[0] == [0, 0] and padding[1] == [0, 0]):
                    raise ValueError(
                        "Non-zero pool_padding(%s) in the batch or channel dimensions "
1761 1762
                        "is not supported." % str(padding)
                    )
1763 1764 1765 1766 1767 1768
                padding = padding[2:4]
                padding = [ele for a_list in padding for ele in a_list]
            elif is_list_or_tuple(padding[0]) and (data_format == "NHWC"):
                if not (padding[0] == [0, 0] and padding[3] == [0, 0]):
                    raise ValueError(
                        "Non-zero pool_padding(%s) in the batch or channel dimensions "
1769 1770
                        "is not supported." % str(padding)
                    )
1771 1772 1773
                padding = padding[1:3]
                padding = [ele for a_list in padding for ele in a_list]
            padding = utils.convert_to_list(padding, 4, 'padding')
1774

1775 1776
            if utils._is_symmetric_padding(padding, 2):
                padding = [padding[0], padding[2]]
1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
        else:
            padding = utils.convert_to_list(padding, 2, 'padding')

        return padding

    padding_algorithm = "EXPLICIT"
    if isinstance(pool_padding, str):
        pool_padding = pool_padding.upper()
        if pool_padding not in ["SAME", "VALID"]:
            raise ValueError(
                "Unknown Attr(pool_padding): '%s'. It can only be 'SAME' or 'VALID'."
1788 1789
                % str(pool_padding)
            )
1790 1791
        if pool_padding == "VALID":
            padding_algorithm = "VALID"
1792
            pool_padding = [0, 0]
1793 1794 1795
            if ceil_mode != False:
                raise ValueError(
                    "When Attr(pool_padding) is \"VALID\", Attr(ceil_mode) must be False. "
1796 1797
                    "Received ceil_mode: True."
                )
1798 1799
        elif pool_padding == "SAME":
            padding_algorithm = "SAME"
1800
            pool_padding = [0, 0]
1801 1802

    pool_padding = update_padding(pool_padding, data_format)
1803
    if in_dygraph_mode():
1804
        input = input._use_gpudnn(use_cudnn)
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817
        return _C_ops.pool2d(
            input,
            pool_size,
            pool_stride,
            pool_padding,
            ceil_mode,
            exclusive,
            data_format,
            pool_type,
            global_pooling,
            False,
            padding_algorithm,
        )
1818 1819
    op_type = 'pool2d'
    helper = LayerHelper(op_type, **locals())
Y
Yu Yang 已提交
1820
    dtype = helper.input_dtype()
X
Xin Pan 已提交
1821
    pool_out = helper.create_variable_for_type_inference(dtype)
Y
Yu Yang 已提交
1822

1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840
    helper.append_op(
        type=op_type,
        inputs={"X": input},
        outputs={"Out": pool_out},
        attrs={
            "pooling_type": pool_type,
            "ksize": pool_size,
            "global_pooling": global_pooling,
            "strides": pool_stride,
            "paddings": pool_padding,
            "padding_algorithm": padding_algorithm,
            "use_cudnn": use_cudnn,
            "ceil_mode": ceil_mode,
            "use_mkldnn": False,
            "exclusive": exclusive,
            "data_format": data_format,
        },
    )
1841 1842 1843 1844

    return pool_out


1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
def batch_norm(
    input,
    act=None,
    is_test=False,
    momentum=0.9,
    epsilon=1e-05,
    param_attr=None,
    bias_attr=None,
    data_layout='NCHW',
    in_place=False,
    name=None,
    moving_mean_name=None,
    moving_variance_name=None,
    do_model_average_for_mean_and_var=True,
    use_global_stats=False,
):
1861
    r"""
1862 1863
    :api_attr: Static Graph

Q
qiaolongfei 已提交
1864 1865
    **Batch Normalization Layer**

L
lvmengsi 已提交
1866
    Can be used as a normalizer function for convolution or fully_connected operations.
Q
qiaolongfei 已提交
1867
    The required data format for this layer is one of the following:
Q
qiaolongfei 已提交
1868

Q
qiaolongfei 已提交
1869
    1. NHWC `[batch, in_height, in_width, in_channels]`
Q
qiaolongfei 已提交
1870

Q
qiaolongfei 已提交
1871 1872
    2. NCHW `[batch, in_channels, in_height, in_width]`

Q
qiaolongfei 已提交
1873 1874 1875
    Refer to `Batch Normalization: Accelerating Deep Network Training by Reducing
    Internal Covariate Shift <https://arxiv.org/pdf/1502.03167.pdf>`_
    for more details.
Q
qiaolongfei 已提交
1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887

    :math:`input` is the input features over a mini-batch.

    ..  math::

        \\mu_{\\beta} &\\gets \\frac{1}{m} \\sum_{i=1}^{m} x_i \\qquad &//\\
        \ mini-batch\ mean \\\\
        \\sigma_{\\beta}^{2} &\\gets \\frac{1}{m} \\sum_{i=1}^{m}(x_i - \\
        \\mu_{\\beta})^2 \\qquad &//\ mini-batch\ variance \\\\
        \\hat{x_i} &\\gets \\frac{x_i - \\mu_\\beta} {\\sqrt{\\
        \\sigma_{\\beta}^{2} + \\epsilon}} \\qquad &//\ normalize \\\\
        y_i &\\gets \\gamma \\hat{x_i} + \\beta \\qquad &//\ scale\ and\ shift
1888

L
lvmengsi 已提交
1889
        moving\_mean = moving\_mean * momentum + mini-batch\_mean * (1. - momentum) \\\\
1890
        moving\_var = moving\_var * momentum + mini-batch\_var * (1. - momentum)
L
lvmengsi 已提交
1891

1892

L
lvmengsi 已提交
1893
    moving_mean is global mean and moving_var is global variance.
1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906

    When use_global_stats = True, the :math:`\\mu_{\\beta}`
    and :math:`\\sigma_{\\beta}^{2}` are not the statistics of one mini-batch.
    They are global (or running) statistics. (It usually got from the
    pre-trained model.)
    The training and testing (or inference) have the same behavior:

    ..  math::

        \\hat{x_i} &\\gets \\frac{x_i - \\mu_\\beta} {\\sqrt{\\
        \\sigma_{\\beta}^{2} + \\epsilon}}  \\\\
        y_i &\\gets \\gamma \\hat{x_i} + \\beta

L
lvmengsi 已提交
1907
    Note:
1908
        if build_strategy.sync_batch_norm=True, the batch_norm in network will use
L
lvmengsi 已提交
1909
        sync_batch_norm automatically.
1910
        `is_test = True` can only be used in test program and inference program, `is_test` CANNOT be set to True in train program, if you want to use global status from pre_train model in train program, please set `use_global_stats = True`.
L
lvmengsi 已提交
1911

1912
    Args:
1913
        input(Tensor): The rank of input Tensor can be 2, 3, 4, 5. The data type
L
lvmengsi 已提交
1914
            is float16 or float32 or float64.
Q
qiaolongfei 已提交
1915
        act(string, Default None): Activation type, linear|relu|prelu|...
Q
qingqing01 已提交
1916 1917
        is_test (bool, Default False): A flag indicating whether it is in
            test phrase or not.
1918 1919
        momentum(float|Tensor, Default 0.9): The value used for the moving_mean and
            moving_var computation. This should be a float number or a Tensor with
1920
            shape [1] and data type as float32. The updated formula is:
Q
qingqing01 已提交
1921 1922 1923 1924 1925
            :math:`moving\_mean = moving\_mean * momentum + new\_mean * (1. - momentum)`
            :math:`moving\_var = moving\_var * momentum + new\_var * (1. - momentum)`
            Default is 0.9.
        epsilon(float, Default 1e-05): A value added to the denominator for
            numerical stability. Default is 1e-5.
C
chengduo 已提交
1926 1927
        param_attr(ParamAttr|None): The parameter attribute for Parameter `scale`
             of batch_norm. If it is set to None or one attribute of ParamAttr, batch_norm
1928
	     will create ParamAttr as param_attr, the name of scale can be set in ParamAttr.
1929
	     If the Initializer of the param_attr is not set, the parameter is initialized
1930
	     with Xavier. Default: None.
C
chengduo 已提交
1931 1932
        bias_attr(ParamAttr|None): The parameter attribute for the bias of batch_norm.
             If it is set to None or one attribute of ParamAttr, batch_norm
1933 1934
	     will create ParamAttr as bias_attr, the name of bias can be set in ParamAttr.
	     If the Initializer of the bias_attr is not set, the bias is initialized zero.
1935
	     Default: None.
1936
        data_layout (str, optional): Specify the data format of the input, and the data format of the output
K
Kaipeng Deng 已提交
1937 1938 1939
             will be consistent with that of the input. An optional string from: `"NCHW"`, `"NHWC"`.
             The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
             `[batch_size, input_channels, input_height, input_width]`.
1940
        in_place(bool, Default False): Make the input and output of batch norm reuse memory.
1941 1942 1943 1944
        name(str|None): For detailed information, please refer to :ref:`api_guide_Name`.
            Usually name is no need to set and None by default.
        moving_mean_name(str, Default None): The name of moving_mean which store the global Mean. If it
            is set to None, batch_norm will save global mean with a random name, otherwise, batch_norm
1945
            will save global mean with the string.
L
lvmengsi 已提交
1946
        moving_variance_name(str, Default None): The name of the moving_variance which store the global Variance.
1947
            If it is set to None, batch_norm will save global variance with a random name, otherwise, batch_norm
1948
            will save global variance with the string.
1949 1950
        do_model_average_for_mean_and_var(bool, Default True): Whether parameter mean and variance should do model
            average when model average is enabled.
1951 1952 1953 1954 1955
        use_global_stats(bool, Default False): Whether to use global mean and
            variance. In inference or test mode, set use_global_stats to true
            or is_test to true, and the behavior is equivalent.
            In train mode, when setting use_global_stats True, the global mean
            and variance are also used during train period.
1956
    Returns:
1957
        A Tensor which is the result after applying batch normalization on the input,
1958
        has same shape and data type with input.
Q
qiaolongfei 已提交
1959 1960 1961 1962 1963

    Examples:

        .. code-block:: python

1964
            import paddle
1965

1966
            paddle.enable_static()
1967 1968 1969 1970 1971 1972 1973
            x = paddle.static.data(name='x', shape=[3, 7, 3, 7], dtype='float32')
            hidden1 = paddle.static.nn.fc(x=x, size=200)
            print(hidden1.shape)
            # [3, 200]
            hidden2 = paddle.static.nn.batch_norm(input=hidden1)
            print(hidden2.shape)
            # [3, 200]
Y
Yu Yang 已提交
1974
    """
1975 1976 1977
    assert (
        bias_attr is not False
    ), "bias_attr should not be False in batch_norm."
Y
Yu Yang 已提交
1978 1979
    helper = LayerHelper('batch_norm', **locals())

1980 1981 1982
    check_variable_and_dtype(
        input, 'input', ['float16', 'float32', 'float64'], 'batch_norm'
    )
1983
    dtype = helper.input_dtype()
1984

W
Wu Yi 已提交
1985 1986 1987 1988
    # use fp32 for bn parameter
    if dtype == core.VarDesc.VarType.FP16:
        dtype = core.VarDesc.VarType.FP32

Y
Yu Yang 已提交
1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
    input_shape = input.shape
    if data_layout == 'NCHW':
        channel_num = input_shape[1]
    else:
        if data_layout == 'NHWC':
            channel_num = input_shape[-1]
        else:
            raise ValueError("unsupported data layout:" + data_layout)

    param_shape = [channel_num]

    # create parameter
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
    scale = helper.create_parameter(
        attr=helper.param_attr,
        shape=param_shape,
        dtype=dtype,
        default_initializer=Constant(1.0),
    )
    bias = helper.create_parameter(
        attr=helper.bias_attr, shape=param_shape, dtype=dtype, is_bias=True
    )

    mean = helper.create_parameter(
        attr=ParamAttr(
            name=moving_mean_name,
            initializer=Constant(0.0),
            trainable=False,
            do_model_average=do_model_average_for_mean_and_var,
        ),
        shape=param_shape,
        dtype=dtype,
    )
2021 2022
    mean.stop_gradient = True

2023 2024 2025 2026 2027 2028 2029 2030 2031 2032
    variance = helper.create_parameter(
        attr=ParamAttr(
            name=moving_variance_name,
            initializer=Constant(1.0),
            trainable=False,
            do_model_average=do_model_average_for_mean_and_var,
        ),
        shape=param_shape,
        dtype=dtype,
    )
2033
    variance.stop_gradient = True
Y
Yu Yang 已提交
2034 2035 2036 2037

    # create output
    # mean and mean_out share the same memory
    mean_out = mean
2038
    # variance and variance_out share the same memory
Y
Yu Yang 已提交
2039
    variance_out = variance
2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051

    if in_dygraph_mode():
        inputs_has_MomemtumTensor = False
        attrs_has_momentum = False
        tmp_tensor_type = core.eager.Tensor
        if isinstance(momentum, tmp_tensor_type):
            inputs_has_MomemtumTensor = True
        else:
            attrs_has_momentum = True

        attrs_ = ()
        if attrs_has_momentum:
2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067
            attrs_ = (
                'momentum',
                momentum,
                'epsilon',
                epsilon,
                'is_test',
                is_test,
                'data_layout',
                data_layout,
                'use_mkldnn',
                False,
                'fuse_with_relu',
                False,
                'use_global_stats',
                use_global_stats,
            )
2068
        else:
2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082
            attrs_ = (
                'epsilon',
                epsilon,
                'is_test',
                is_test,
                'data_layout',
                data_layout,
                'use_mkldnn',
                False,
                'fuse_with_relu',
                False,
                'use_global_stats',
                use_global_stats,
            )
2083
        if inputs_has_MomemtumTensor:
2084
            batch_norm_out, _, _, _, _, _ = _legacy_C_ops.batch_norm(
2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
                input,
                scale,
                bias,
                mean,
                variance,
                momentum,
                mean_out,
                variance_out,
                *attrs_,
            )
2095
        else:
2096
            batch_norm_out, _, _, _, _, _ = _legacy_C_ops.batch_norm(
2097 2098 2099 2100 2101 2102 2103 2104 2105 2106
                input,
                scale,
                bias,
                mean,
                variance,
                None,
                mean_out,
                variance_out,
                *attrs_,
            )
2107

2108 2109 2110
        return dygraph_utils._append_activation_in_dygraph(
            batch_norm_out, act=act, use_mkldnn=False
        )
2111

2112 2113 2114
    saved_mean = helper.create_variable_for_type_inference(
        dtype=dtype, stop_gradient=True
    )
X
Xin Pan 已提交
2115
    saved_variance = helper.create_variable_for_type_inference(
2116 2117
        dtype=dtype, stop_gradient=True
    )
2118
    reserve_space = None
2119
    if not is_test:
2120
        reserve_space = helper.create_variable_for_type_inference(
2121 2122
            dtype=helper.input_dtype(), stop_gradient=True
        )
2123

2124 2125 2126
    batch_norm_out = (
        input if in_place else helper.create_variable_for_type_inference(dtype)
    )
Y
Yu Yang 已提交
2127

2128 2129 2130 2131 2132
    inputs = {
        "X": input,
        "Scale": scale,
        "Bias": bias,
        "Mean": mean,
2133 2134
        "Variance": variance,
        "MeanOut": mean_out,
2135
        "VarianceOut": variance_out,
2136 2137 2138 2139 2140 2141 2142
    }
    attrs = {
        "epsilon": epsilon,
        "is_test": is_test,
        "data_layout": data_layout,
        "use_mkldnn": False,
        "fuse_with_relu": False,
2143
        "use_global_stats": use_global_stats,
2144 2145 2146 2147 2148
    }
    if isinstance(momentum, Variable):
        inputs['MomemtumTensor'] = momentum
    else:
        attrs['momentum'] = momentum
2149 2150 2151 2152 2153 2154

    outputs = {
        "Y": batch_norm_out,
        "MeanOut": mean_out,
        "VarianceOut": variance_out,
        "SavedMean": saved_mean,
2155
        "SavedVariance": saved_variance,
2156 2157 2158 2159
    }
    if reserve_space is not None:
        outputs["ReserveSpace"] = reserve_space

2160 2161 2162
    helper.append_op(
        type="batch_norm", inputs=inputs, outputs=outputs, attrs=attrs
    )
Y
Yu Yang 已提交
2163 2164 2165 2166

    return helper.append_activation(batch_norm_out)


Y
yuyang18 已提交
2167
@templatedoc()
2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178
def layer_norm(
    input,
    scale=True,
    shift=True,
    begin_norm_axis=1,
    epsilon=1e-05,
    param_attr=None,
    bias_attr=None,
    act=None,
    name=None,
):
2179
    r"""
2180 2181
    :api_attr: Static Graph

2182 2183 2184 2185
    **Layer Normalization Layer**

    The API implements the function of the Layer Normalization Layer and can be applied to mini-batch input data.
    Refer to `Layer Normalization <https://arxiv.org/pdf/1607.06450v1.pdf>`_
G
guosheng 已提交
2186 2187 2188

    The formula is as follows:

Y
yuyang18 已提交
2189
    ..  math::
G
guosheng 已提交
2190

2191
        \\mu & = \\frac{1}{H}\\sum_{i=1}^{H} x_i
G
guosheng 已提交
2192

2193
        \\sigma & = \\sqrt{\\frac{1}{H}\sum_{i=1}^{H}{(x_i - \\mu)^2} + \\epsilon}
Y
yuyang18 已提交
2194

2195
        y & = f(\\frac{g}{\\sigma}(x - \\mu) + b)
Y
yuyang18 已提交
2196

2197 2198 2199 2200 2201
    - :math:`x`: the vector representation of the summed inputs to the neurons in that layer.
    - :math:`H`: the number of hidden units in a layers
    - :math:`\\epsilon`: the small value added to the variance to prevent division by zero.
    - :math:`g`: the trainable scale parameter.
    - :math:`b`: the trainable bias parameter.
Y
yuyang18 已提交
2202

G
guosheng 已提交
2203
    Args:
2204
        input(Tensor): A multi-dimension ``Tensor`` , and the data type is float32 or float64.
2205 2206 2207 2208 2209
        scale(bool, optional): Whether to learn the adaptive gain :math:`g` after
            normalization. Default: True.
        shift(bool, optional): Whether to learn the adaptive bias :math:`b` after
            normalization. Default: True.
        begin_norm_axis(int, optional): The normalization will be performed along
G
guosheng 已提交
2210
            dimensions from :attr:`begin_norm_axis` to :attr:`rank(input)`.
2211 2212 2213 2214
            Default: 1.
        epsilon(float, optional): The small value added to the variance to prevent
            division by zero. Default: 1e-05.
        param_attr(ParamAttr, optional): The parameter attribute for the learnable
S
sneaxiy 已提交
2215 2216
            gain :math:`g`. If :attr:`scale` is False, :attr:`param_attr` is
            omitted. If :attr:`scale` is True and :attr:`param_attr` is None,
2217
            a default :code:`ParamAttr` would be added as scale. The
2218 2219
            :attr:`param_attr` is initialized as 1 if it is added. Default: None.
        bias_attr(ParamAttr, optional): The parameter attribute for the learnable
S
sneaxiy 已提交
2220 2221
            bias :math:`b`. If :attr:`shift` is False, :attr:`bias_attr` is
            omitted. If :attr:`shift` is True and :attr:`param_attr` is None,
2222
            a default :code:`ParamAttr` would be added as bias. The
2223
            :attr:`bias_attr` is initialized as 0 if it is added. Default: None.
T
tianshuo78520a 已提交
2224
        act(str, optional): Activation to be applied to the output of layer normalization.
2225 2226
                  Default: None.
        name(str): 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
guosheng 已提交
2227 2228

    Returns:
2229
        Tensor: ``Tensor``  indicating the normalized result, the data type is the same as  ``input`` , and the return dimension is the same as  ``input`` .
G
guosheng 已提交
2230 2231 2232

    Examples:

2233 2234
        .. code-block:: python

2235 2236
            import paddle
            paddle.enable_static()
2237 2238 2239
            x = paddle.static.data(name='x', shape=[8, 32, 32], dtype='float32')
            output = paddle.static.nn.layer_norm(input=x, begin_norm_axis=1)
            print(output.shape)  # [8, 32, 32]
G
guosheng 已提交
2240
    """
2241 2242 2243
    assert (
        _non_static_mode() is not True
    ), "please use LayerNorm instead of layer_norm in dygraph mode!"
G
guosheng 已提交
2244
    helper = LayerHelper('layer_norm', **locals())
2245 2246 2247
    check_variable_and_dtype(
        input, 'input', ['float32', 'float64'], 'layer_norm'
    )
G
guosheng 已提交
2248 2249 2250 2251 2252 2253 2254
    dtype = helper.input_dtype()

    # create intput and parameters
    inputs = {'X': input}
    input_shape = input.shape
    param_shape = [reduce(lambda x, y: x * y, input_shape[begin_norm_axis:])]
    if scale:
2255 2256 2257 2258 2259 2260 2261 2262 2263
        assert (
            param_attr is not False
        ), "param_attr should not be False when using scale."
        scale = helper.create_parameter(
            attr=helper.param_attr,
            shape=param_shape,
            dtype=dtype,
            default_initializer=Constant(1.0),
        )
G
guosheng 已提交
2264
        inputs['Scale'] = scale
2265 2266
    else:
        if param_attr:
T
tianshuo78520a 已提交
2267
            warnings.warn("param_attr is only available with scale is True.")
G
guosheng 已提交
2268
    if shift:
2269 2270 2271 2272 2273 2274
        assert (
            bias_attr is not False
        ), "bias_attr should not be False when using shift."
        bias = helper.create_parameter(
            attr=helper.bias_attr, shape=param_shape, dtype=dtype, is_bias=True
        )
G
guosheng 已提交
2275
        inputs['Bias'] = bias
2276 2277
    else:
        if bias_attr:
T
tianshuo78520a 已提交
2278
            warnings.warn("bias_attr is only available with shift is True.")
G
guosheng 已提交
2279 2280

    # create output
2281 2282 2283 2284 2285 2286
    mean_out = helper.create_variable_for_type_inference(
        dtype=dtype, stop_gradient=True
    )
    variance_out = helper.create_variable_for_type_inference(
        dtype=dtype, stop_gradient=True
    )
X
Xin Pan 已提交
2287
    layer_norm_out = helper.create_variable_for_type_inference(dtype)
G
guosheng 已提交
2288

2289 2290 2291 2292 2293 2294 2295 2296 2297 2298
    helper.append_op(
        type="layer_norm",
        inputs=inputs,
        outputs={
            "Y": layer_norm_out,
            "Mean": mean_out,
            "Variance": variance_out,
        },
        attrs={"epsilon": epsilon, "begin_norm_axis": begin_norm_axis},
    )
G
guosheng 已提交
2299 2300 2301 2302

    return helper.append_activation(layer_norm_out)


D
dengkaipeng 已提交
2303
@templatedoc()
2304
def spectral_norm(weight, dim=0, power_iters=1, eps=1e-12, name=None):
2305
    r"""
2306 2307
    :api_attr: Static Graph

D
dengkaipeng 已提交
2308 2309
    **Spectral Normalization Layer**

K
Kaipeng Deng 已提交
2310
    This operation calculates the spectral normalization value of weight parameters of
2311
    fc, conv1d, conv2d, conv3d layers which should be 2-D, 3-D, 4-D, 5-D
K
Kaipeng Deng 已提交
2312 2313
    Parameters. Output tensor will be in same shape with input tensor.
    Calculations are showed as follows.
2314

D
dengkaipeng 已提交
2315 2316 2317
    Step 1:
    Generate vector U in shape of [H], and V in shape of [W].
    While H is the :attr:`dim` th dimension of the input weights,
D
dengkaipeng 已提交
2318
    and W is the product result of remaining dimensions.
D
dengkaipeng 已提交
2319 2320

    Step 2:
T
tianshuo78520a 已提交
2321
    :attr:`power_iters` should be a positive integer, do following
K
Kaipeng Deng 已提交
2322 2323
    calculations with U and V for :attr:`power_iters` rounds. Calculations
    as follows:
D
dengkaipeng 已提交
2324

2325
    .. math::
D
dengkaipeng 已提交
2326 2327 2328 2329 2330 2331

        \mathbf{v} := \\frac{\mathbf{W}^{T} \mathbf{u}}{\|\mathbf{W}^{T} \mathbf{u}\|_2}

        \mathbf{u} := \\frac{\mathbf{W}^{T} \mathbf{v}}{\|\mathbf{W}^{T} \mathbf{v}\|_2}

    Step 3:
D
dengkaipeng 已提交
2332
    Calculate :math:`\sigma(\mathbf{W})` and normalize weight values.
D
dengkaipeng 已提交
2333 2334 2335 2336

    .. math::

        \sigma(\mathbf{W}) = \mathbf{u}^{T} \mathbf{W} \mathbf{v}
2337

D
dengkaipeng 已提交
2338
        \mathbf{W} = \\frac{\mathbf{W}}{\sigma(\mathbf{W})}
2339

2340

D
dengkaipeng 已提交
2341 2342 2343
    Refer to `Spectral Normalization <https://arxiv.org/abs/1802.05957>`_ .

    Args:
C
Chen Long 已提交
2344
        weight(Tensor): ${weight_comment}
D
dengkaipeng 已提交
2345 2346 2347
        dim(int): ${dim_comment}
        power_iters(int): ${power_iters_comment}
        eps(float): ${eps_comment}
K
Kaipeng Deng 已提交
2348 2349 2350
        name(str, optional): For detailed information, please refer
                             to :ref:`api_guide_Name`. Usually name is no need to set and
                             None by default.
D
dengkaipeng 已提交
2351 2352

    Returns:
C
Chen Long 已提交
2353
        Tensor: A tensor of weight parameters after spectral normalization.
K
Kaipeng Deng 已提交
2354
                  The data type and shape is same as input tensor.
D
dengkaipeng 已提交
2355 2356

    Examples:
K
Kaipeng Deng 已提交
2357
       .. code-block:: python
D
dengkaipeng 已提交
2358

2359
            import paddle
K
Kaipeng Deng 已提交
2360

2361
            paddle.enable_static()
C
Chen Long 已提交
2362
            weight = paddle.static.data(name='weight', shape=[2, 8, 32, 32], dtype='float32')
2363
            x = paddle.static.nn.spectral_norm(weight=weight, dim=1, power_iters=2)
C
Chen Long 已提交
2364
            print(x.shape) # [2, 8, 32, 32]
D
dengkaipeng 已提交
2365 2366
    """
    helper = LayerHelper('spectral_norm', **locals())
2367 2368 2369
    check_variable_and_dtype(
        weight, 'weight', ['float32', 'float64'], 'spectral_norm'
    )
2370 2371 2372
    check_type(dim, 'dim', int, 'spectral_norm')
    check_type(power_iters, 'power_iters', int, 'spectral_norm')
    check_type(eps, 'eps', float, 'spectral_norm')
2373
    dtype = weight.dtype
D
dengkaipeng 已提交
2374 2375

    # create intput and parameters
2376
    input_shape = weight.shape
2377
    assert weight.numel() > 0, "Any dimension of input cannot be equal to 0."
2378 2379 2380 2381 2382
    assert dim < len(input_shape), (
        "The input `dim` should be less than the "
        "rank of `weight`, but received dim="
        "{}".format(dim)
    )
2383 2384 2385
    h = input_shape[dim]
    w = np.prod(input_shape) // h

2386 2387 2388 2389 2390 2391
    u = helper.create_parameter(
        attr=ParamAttr(),
        shape=[h],
        dtype=dtype,
        default_initializer=Normal(0.0, 1.0),
    )
2392
    u.stop_gradient = True
2393 2394 2395 2396 2397 2398
    v = helper.create_parameter(
        attr=ParamAttr(),
        shape=[w],
        dtype=dtype,
        default_initializer=Normal(0.0, 1.0),
    )
2399
    v.stop_gradient = True
D
dengkaipeng 已提交
2400

2401 2402 2403 2404 2405 2406 2407
    if in_dygraph_mode():
        return _C_ops.spectral_norm(weight, u, v, dim, power_iters, eps)

    inputs = {'Weight': weight}
    inputs['U'] = u
    inputs['V'] = v

D
dengkaipeng 已提交
2408
    # create output
2409
    out = helper.create_variable(dtype=dtype)
D
Dun 已提交
2410

2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422
    helper.append_op(
        type="spectral_norm",
        inputs=inputs,
        outputs={
            "Out": out,
        },
        attrs={
            "dim": dim,
            "power_iters": power_iters,
            "eps": eps,
        },
    )
D
Dun 已提交
2423

2424
    return out
D
Dun 已提交
2425 2426


C
caoying03 已提交
2427
def reduce_sum(input, dim=None, keep_dim=False, name=None):
G
guosheng 已提交
2428
    """
2429

Y
yangyaming 已提交
2430
    Computes the sum of tensor elements over the given dimension.
G
guosheng 已提交
2431 2432

    Args:
2433 2434 2435
        input (Variable): The input variable which is a Tensor, the data type is float32,
            float64, int32, int64.
        dim (list|int, optional): The dimensions along which the sum is performed. If
Y
yangyaming 已提交
2436 2437
            :attr:`None`, sum all elements of :attr:`input` and return a
            Tensor variable with a single element, otherwise must be in the
W
whs 已提交
2438 2439
            range :math:`[-rank(input), rank(input))`. If :math:`dim[i] < 0`,
            the dimension to reduce is :math:`rank + dim[i]`.
2440
        keep_dim (bool, optional): Whether to reserve the reduced dimension in the
Y
yangyaming 已提交
2441
            output Tensor. The result tensor will have one fewer dimension
2442 2443 2444 2445
            than the :attr:`input` unless :attr:`keep_dim` is true, default
            value is False.
        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
guosheng 已提交
2446 2447

    Returns:
2448 2449
        Variable: Tensor, results of summation operation on the specified dim of input tensor,
        it's data type is the same as input's Tensor.
F
fengjiayi 已提交
2450

2451 2452
    Raises:
        TypeError, if out data type is different with the input data type.
2453

G
guosheng 已提交
2454 2455 2456
    Examples:
        .. code-block:: python

2457
            import paddle.fluid as fluid
2458 2459
            import paddle
            paddle.enable_static()
G
guosheng 已提交
2460 2461 2462
            # x is a Tensor variable with following elements:
            #    [[0.2, 0.3, 0.5, 0.9]
            #     [0.1, 0.2, 0.6, 0.7]]
Q
qiaolongfei 已提交
2463
            # Each example is followed by the corresponding output tensor.
2464
            x = fluid.data(name='x', shape=[2, 4], dtype='float32')
G
guosheng 已提交
2465 2466 2467 2468
            fluid.layers.reduce_sum(x)  # [3.5]
            fluid.layers.reduce_sum(x, dim=0)  # [0.3, 0.5, 1.1, 1.6]
            fluid.layers.reduce_sum(x, dim=-1)  # [1.9, 1.6]
            fluid.layers.reduce_sum(x, dim=1, keep_dim=True)  # [[1.9], [1.6]]
W
whs 已提交
2469

2470
            # y is a Tensor variable with shape [2, 2, 2] and elements as below:
W
whs 已提交
2471 2472
            #      [[[1, 2], [3, 4]],
            #      [[5, 6], [7, 8]]]
Q
qiaolongfei 已提交
2473
            # Each example is followed by the corresponding output tensor.
2474
            y = fluid.data(name='y', shape=[2, 2, 2], dtype='float32')
2475 2476
            fluid.layers.reduce_sum(y, dim=[1, 2]) # [10, 26]
            fluid.layers.reduce_sum(y, dim=[0, 1]) # [16, 20]
W
whs 已提交
2477

G
guosheng 已提交
2478
    """
2479 2480
    reduce_all, dim = _get_reduce_dim(dim, input)

2481
    if in_dygraph_mode():
2482
        return _C_ops.sum(input, dim, None, keep_dim)
2483
    elif _in_legacy_dygraph():
2484 2485 2486
        return _legacy_C_ops.reduce_sum(
            input, 'dim', dim, 'keep_dim', keep_dim, 'reduce_all', reduce_all
        )
2487
    attrs = {'dim': dim, 'keep_dim': keep_dim, 'reduce_all': reduce_all}
2488
    check_variable_and_dtype(
2489 2490 2491 2492 2493
        input,
        'input',
        ['float16', 'float32', 'float64', 'int32', 'int64'],
        'reduce_sum',
    )
2494
    helper = LayerHelper('reduce_sum', **locals())
X
Xin Pan 已提交
2495
    out = helper.create_variable_for_type_inference(dtype=helper.input_dtype())
2496 2497 2498 2499 2500 2501
    helper.append_op(
        type='reduce_sum',
        inputs={'X': input},
        outputs={'Out': out},
        attrs=attrs,
    )
G
guosheng 已提交
2502
    return out
G
guosheng 已提交
2503 2504


C
caoying03 已提交
2505
def split(input, num_or_sections, dim=-1, name=None):
G
guosheng 已提交
2506
    """
2507
    Split the input tensor into multiple sub-Tensors.
G
guosheng 已提交
2508 2509

    Args:
2510
        input (Tensor): A N-D Tensor. The data type is bool, float16, float32, float64, int32 or int64.
2511
        num_or_sections (int|list|tuple): If ``num_or_sections`` is int, then the ``num_or_sections``
2512
            indicates the number of equal sized sub-Tensors that the ``input``
2513
            will be divided into. If ``num_or_sections`` is a list or tuple, the length of it
2514 2515 2516 2517 2518
            indicates the number of sub-Tensors and the elements in it indicate the sizes of sub-Tensors'
            dimension orderly. The length of the list mustn't be larger than the ``input`` 's size of specified dim.
        dim (int|Tensor, optional): The dimension along which to split, it can be a scalar with type ``int`` or
            a ``Tensor`` with shape [1] and data type ``int32`` or ``int64``. If :math:`dim < 0`,
            the dimension to split along is :math:`rank(input) + dim`. Default is -1.
2519
        name (str, optional): The default value is None.  Normally there is no need for user to set this property.
2520
            For more information, please refer to :ref:`api_guide_Name` .
G
guosheng 已提交
2521 2522

    Returns:
2523
        list(Tensor): The list of segmented Tensors.
G
guosheng 已提交
2524

2525
    Example:
G
guosheng 已提交
2526 2527
        .. code-block:: python

2528 2529
            import paddle.fluid as fluid

2530
            # input is a Tensor which shape is [3, 9, 5]
2531
            input = fluid.data(
2532 2533
                 name="input", shape=[3, 9, 5], dtype="float32")

2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547
            out0, out1, out2 = fluid.layers.split(input, num_or_sections=3, dim=1)
            # out0.shape [3, 3, 5]
            # out1.shape [3, 3, 5]
            # out2.shape [3, 3, 5]

            out0, out1, out2 = fluid.layers.split(input, num_or_sections=[2, 3, 4], dim=1)
            # out0.shape [3, 2, 5]
            # out1.shape [3, 3, 5]
            # out2.shape [3, 4, 5]

            out0, out1, out2 = fluid.layers.split(input, num_or_sections=[2, 3, -1], dim=1)
            # out0.shape [3, 2, 5]
            # out1.shape [3, 3, 5]
            # out2.shape [3, 4, 5]
2548

2549 2550 2551 2552 2553 2554
            # dim is negative, the real dim is (rank(input) + axis) which real
            # value is 1.
            out0, out1, out2 = fluid.layers.split(input, num_or_sections=3, dim=-2)
            # out0.shape [3, 3, 5]
            # out1.shape [3, 3, 5]
            # out2.shape [3, 3, 5]
2555

G
guosheng 已提交
2556
    """
J
Jiabin Yang 已提交
2557
    if _non_static_mode():
2558 2559 2560
        num = None
        attrs = ()

S
songyouwei 已提交
2561 2562
        if isinstance(dim, Variable):
            dim = dim.numpy()
2563
            dim = dim.item(0)
W
wangzhen38 已提交
2564
        assert len(input.shape) + dim >= 0, "(rank(x) + axis) must >= 0"
S
songyouwei 已提交
2565
        dim = (len(input.shape) + dim) if dim < 0 else dim
2566
        attrs += ('axis', dim)
2567 2568 2569

        if isinstance(num_or_sections, int):
            num = num_or_sections
2570
            attrs += ('num', num_or_sections)
L
Leo Chen 已提交
2571
        elif isinstance(num_or_sections, (list, tuple)):
2572
            num = len(num_or_sections)
L
Leo Chen 已提交
2573
            if utils._contain_var(num_or_sections):
2574 2575
                for index, item in enumerate(num_or_sections):
                    if isinstance(item, Variable):
2576 2577 2578
                        num_or_sections[index] = num_or_sections[index].numpy()[
                            0
                        ]
2579
                attrs += ('sections', list(num_or_sections))
L
Leo Chen 已提交
2580
            else:
2581
                attrs += ('sections', list(num_or_sections))
2582 2583
        else:
            raise TypeError(
2584
                "The type of 'num_or_sections' in split must be int, list or tuple in imperative mode, but "
2585 2586
                "received %s." % (type(num_or_sections))
            )
2587
        if in_dygraph_mode():
C
Charles-hit 已提交
2588 2589 2590 2591
            if isinstance(num_or_sections, int):
                return _C_ops.split_with_num(input, num_or_sections, dim)
            else:
                return _C_ops.split(input, num_or_sections, dim)
2592 2593
        elif _in_legacy_dygraph():
            out = [_varbase_creator() for n in range(num)]
2594
            _legacy_C_ops.split(input, out, *attrs)
2595
            return out
L
Leo Chen 已提交
2596

2597
    check_variable_and_dtype(
2598 2599 2600 2601 2602
        input,
        'input',
        ['bool', 'float16', 'float32', 'float64', 'int32', 'int64'],
        'split',
    )
2603 2604 2605 2606
    check_type(num_or_sections, 'num_or_sections', (list, int, tuple), 'split')
    check_type(dim, 'dim', (int, Variable), 'split')
    if isinstance(dim, Variable):
        check_dtype(dim.dtype, 'dim', ['int32', 'int64'], 'split')
2607

G
guosheng 已提交
2608
    helper = LayerHelper('split', **locals())
2609

G
guosheng 已提交
2610
    input_shape = input.shape
2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621
    inputs = {'X': input}
    attrs = {'num': num_or_sections if isinstance(num_or_sections, int) else 0}

    def _get_SectionsTensorList(one_list):
        tensor_list = []
        unk_dim_idx = -1
        for idx, dim_size in enumerate(one_list):
            if isinstance(dim_size, Variable):
                dim_size.stop_gradient = True
                tensor_list.append(dim_size)
            else:
2622
                assert isinstance(dim_size, int)
2623 2624 2625
                if dim_size == -1:
                    assert unk_dim_idx == -1, (
                        "Only one value of 'num_or_section' in split can "
2626 2627 2628
                        "be -1. But received num_or_section[%d] is also -1."
                        % idx
                    )
2629 2630
                    unk_dim_idx = idx
                temp_out = helper.create_variable_for_type_inference('int32')
2631 2632 2633
                fill_constant(
                    [1], 'int32', dim_size, force_cpu=True, out=temp_out
                )
2634 2635 2636 2637 2638 2639 2640
                tensor_list.append(temp_out)
        return tensor_list

    if isinstance(dim, Variable):
        dim.stop_gradient = True
        inputs['AxisTensor'] = dim
    else:
W
wangzhen38 已提交
2641
        assert len(input.shape) + dim >= 0, "(rank(x) + axis) must >= 0"
2642 2643 2644
        dim = (len(input_shape) + dim) if dim < 0 else dim
        attrs['axis'] = dim

G
guosheng 已提交
2645 2646
    if isinstance(num_or_sections, int):
        assert num_or_sections > 1, 'num_or_sections must be more than 1.'
2647
        if isinstance(dim, int) and input_shape[dim] > 0:
2648 2649 2650 2651 2652 2653
            assert input_shape[dim] % num_or_sections == 0, (
                "The input's size along the split dimension "
                "must be evenly divisible by Attr(num_or_sections). "
                "But %d is not evenly divisible by %d. "
                % (num_or_sections, input_shape[dim])
            )
G
guosheng 已提交
2654 2655
        num = num_or_sections
    else:
2656
        if isinstance(dim, int) and input_shape[dim] > 0:
2657 2658 2659
            assert (
                len(num_or_sections) <= input_shape[dim]
            ), 'len(num_or_sections) must not be more than input.shape[dim].'
G
guosheng 已提交
2660
        num = len(num_or_sections)
2661
        attrs['sections'] = list(
2662 2663 2664 2665 2666
            map(
                lambda ele: -1 if isinstance(ele, Variable) else ele,
                num_or_sections,
            )
        )
L
Leo Chen 已提交
2667
        if utils._contain_var(num_or_sections):
2668
            inputs['SectionsTensorList'] = _get_SectionsTensorList(
2669 2670
                num_or_sections
            )
2671

G
guosheng 已提交
2672
    outs = [
X
Xin Pan 已提交
2673
        helper.create_variable_for_type_inference(dtype=helper.input_dtype())
G
guosheng 已提交
2674 2675
        for i in range(num)
    ]
2676 2677 2678
    helper.append_op(
        type='split', inputs=inputs, outputs={'Out': outs}, attrs=attrs
    )
G
guosheng 已提交
2679
    return outs
C
caoying03 已提交
2680 2681 2682


def l2_normalize(x, axis, epsilon=1e-12, name=None):
2683
    r"""
2684

R
ruri 已提交
2685
    This op normalizes `x` along dimension `axis` using an L2
C
caoying03 已提交
2686 2687
    norm. For a 1-D tensor (`dim` is fixed to 0), this layer computes

2688
    .. math::
2689 2690

        y = \\frac{x}{ \sqrt{\sum {x^2} + epsion }}
C
caoying03 已提交
2691 2692 2693 2694 2695

    For `x` with more dimensions, this layer independently normalizes each 1-D
    slice along dimension `axis`.

    Args:
2696
        x(Variable|list): The input tensor could be N-D tensor, and the input data type could be float16, float32 or float64.
2697
        axis(int): The axis on which to apply normalization. If `axis < 0`, \
2698 2699
            the dimension to normalization is rank(X) + axis. -1 is the
            last dimension.
2700
        epsilon(float): The epsilon value is used to avoid division by zero, \
翟飞跃 已提交
2701
            the default value is 1e-12.
2702
    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`
2703

C
caoying03 已提交
2704
    Returns:
R
ruri 已提交
2705
        Variable: The output has the same shape and data type with `x`.
C
caoying03 已提交
2706 2707

    Examples:
2708

2709 2710
    .. code-block:: python
        :name: code-example1
2711

2712
        import paddle
2713

2714 2715
        X = paddle.randn(shape=[3, 5], dtype='float64')
        out = paddle.fluid.layers.l2_normalize(X, axis=-1)
G
Guoxia Wang 已提交
2716
        print(out)
R
ruri 已提交
2717

2718 2719 2720
        # [[ 0.21558504  0.56360189  0.47466096  0.46269539 -0.44326736]
        #  [-0.70602414 -0.52745777  0.37771788 -0.2804768  -0.04449922]
        #  [-0.33972208 -0.43014923  0.31772556  0.76617881 -0.10761525]]
2721

C
caoying03 已提交
2722
    """
F
fengjiayi 已提交
2723 2724
    if len(x.shape) == 1:
        axis = 0
J
Jiabin Yang 已提交
2725
    if _non_static_mode():
2726 2727 2728
        if in_dygraph_mode():
            out, _ = _C_ops.norm(x, 1 if axis is None else axis, epsilon, False)
        elif _in_legacy_dygraph():
2729 2730 2731
            _, out = _legacy_C_ops.norm(
                x, 'axis', 1 if axis is None else axis, 'epsilon', epsilon
            )
2732 2733 2734
        return out

    check_variable_and_dtype(x, "X", ("float16", "float32", "float64"), "norm")
C
caoying03 已提交
2735

2736
    helper = LayerHelper("l2_normalize", **locals())
X
Xin Pan 已提交
2737 2738
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
    norm = helper.create_variable_for_type_inference(dtype=x.dtype)
2739 2740 2741 2742 2743 2744 2745 2746 2747
    helper.append_op(
        type="norm",
        inputs={"X": x},
        outputs={"Out": out, "Norm": norm},
        attrs={
            "axis": 1 if axis is None else axis,
            "epsilon": epsilon,
        },
    )
C
caoying03 已提交
2748
    return out
2749 2750


S
ShenLiang 已提交
2751
@deprecated(since="2.0.0", update_to="paddle.matmul")
S
sneaxiy 已提交
2752
def matmul(x, y, transpose_x=False, transpose_y=False, alpha=1.0, name=None):
G
guosheng 已提交
2753
    """
Y
ying 已提交
2754 2755 2756 2757
    Applies matrix multiplication to two tensors.

    Currently, the input tensors' rank can be any, but when the rank of any
    inputs is bigger than 3, this two inputs' rank should be equal.
G
guosheng 已提交
2758

C
chengduoZH 已提交
2759
    The actual behavior depends on the shapes of :math:`x`, :math:`y` and the
2760
    flag values of :attr:`transpose_x`, :attr:`transpose_y`. Specifically:
G
guosheng 已提交
2761

2762 2763 2764 2765 2766
    - If a transpose flag is specified, the last two dimensions of the tensor
      are transposed. If the tensor is rank-1 of shape :math:`[D]`, then for
      :math:`x` it is treated as :math:`[1, D]` in nontransposed form and as
      :math:`[D, 1]` in transposed form, whereas for :math:`y` it is the
      opposite: It is treated as :math:`[D, 1]` in nontransposed form and as
2767
      :math:`[1, D]` in transposed form.
G
guosheng 已提交
2768

C
chengduoZH 已提交
2769
    - After transpose, the two tensors are 2-D or n-D and matrix multiplication
2770
      performs in the following way.
G
guosheng 已提交
2771

2772
      - If both are 2-D, they are multiplied like conventional matrices.
C
chengduoZH 已提交
2773
      - If either is n-D, it is treated as a stack of matrices residing in the
Y
ying 已提交
2774
        last two dimensions and a batched matrix multiply supporting broadcast
2775
        applies on the two tensors.
G
guosheng 已提交
2776

Y
ying 已提交
2777 2778
    Also note that if the raw tensor :math:`x` or :math:`y` is rank-1 and
    nontransposed, the prepended or appended dimension :math:`1` will be
C
chengduoZH 已提交
2779
    removed after matrix multiplication.
G
guosheng 已提交
2780 2781 2782

    Args:
        x (Variable): The input variable which is a Tensor or LoDTensor.
2783 2784 2785
        y (Variable): The input variable which is a Tensor or LoDTensor.
        transpose_x (bool): Whether to transpose :math:`x` before multiplication.
        transpose_y (bool): Whether to transpose :math:`y` before multiplication.
S
sneaxiy 已提交
2786
        alpha (float): The scale of output. Default 1.0.
2787
        name(str|None): A name for this layer(optional). If set None, the layer
2788
            will be named automatically.
G
guosheng 已提交
2789 2790

    Returns:
石晓伟 已提交
2791
        Variable: The product Tensor (or LoDTensor) variable.
G
guosheng 已提交
2792

G
guosheng 已提交
2793 2794 2795
    Examples:
        .. code-block:: python

2796
            # Examples to clarify shapes of the inputs and output
C
chengduoZH 已提交
2797
            # x: [B, ..., M, K], y: [B, ..., K, N]
2798
            # fluid.layers.matmul(x, y)  # out: [B, ..., M, N]
Y
ying 已提交
2799

2800
            # x: [B, M, K], y: [B, K, N]
2801
            # fluid.layers.matmul(x, y)  # out: [B, M, N]
Y
ying 已提交
2802

2803
            # x: [B, M, K], y: [K, N]
2804
            # fluid.layers.matmul(x, y)  # out: [B, M, N]
Y
ying 已提交
2805

2806
            # x: [M, K], y: [K, N]
2807
            # fluid.layers.matmul(x, y)  # out: [M, N]
Y
ying 已提交
2808 2809

            # x: [B, M, K], y: [K]
2810
            # fluid.layers.matmul(x, y)  # out: [B, M]
Y
ying 已提交
2811

2812
            # x: [K], y: [K]
2813
            # fluid.layers.matmul(x, y)  # out: [1]
2814

Y
ying 已提交
2815
            # x: [M], y: [N]
2816 2817
            # fluid.layers.matmul(x, y, True, True)  # out: [M, N]

2818
            import paddle
2819
            import paddle.fluid as fluid
2820 2821
            paddle.enable_static()

2822 2823 2824
            x = fluid.layers.data(name='x', shape=[2, 3], dtype='float32')
            y = fluid.layers.data(name='y', shape=[3, 2], dtype='float32')
            out = fluid.layers.matmul(x, y, True, True)
G
guosheng 已提交
2825
    """
J
Jiabin Yang 已提交
2826
    if _non_static_mode():
S
ShenLiang 已提交
2827
        out = _varbase_creator(dtype=x.dtype)
2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838
        _legacy_C_ops.matmul(
            x,
            y,
            out,
            'transpose_X',
            transpose_x,
            'transpose_Y',
            transpose_y,
            'alpha',
            float(alpha),
        )
S
ShenLiang 已提交
2839 2840 2841 2842 2843
        return out

    def __check_input(x, y):
        var_names = {'x': x, 'y': y}
        for name, val in var_names.items():
2844 2845 2846
            check_variable_and_dtype(
                val, name, ['float16', 'float32', 'float64'], 'matmul'
            )
S
ShenLiang 已提交
2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
        x_shape = list(x.shape)
        y_shape = list(y.shape)
        if len(x_shape) == 1:
            x_shape = [1] + x_shape
        if len(y_shape) == 1:
            y_shape = y_shape + [1]

        # check the inner 2 dimensions
        if transpose_x:
            x_shape[-2], x_shape[-1] = x_shape[-1], x_shape[-2]
        if transpose_y:
            y_shape[-2], y_shape[-1] = y_shape[-1], y_shape[-2]
        if x_shape[-1] != y_shape[-2]:
2860 2861 2862 2863 2864 2865
            assert (x_shape[-1] == -1) or (y_shape[-2] == -1), (
                "After performing an optional transpose, Input X's width should be "
                "equal to Y's width for multiplication "
                "prerequisites. But received X's shape: %s, Y's shape: %s\n"
                % (x_shape, y_shape)
            )
S
ShenLiang 已提交
2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876

        if len(y_shape) > 2 and len(x_shape) > 2:
            for i, dim_x in enumerate(x_shape[:-2]):
                # don't check neg shape
                if dim_x < 0 or y_shape[i] < 0:
                    continue
                if dim_x != y_shape[i]:
                    raise ValueError(
                        "When the matrix is larger than 2 dimensions, the higher "
                        "dimensional values of the two matrices need to be equal. "
                        "But received x_shape[%d] != y_shape[%d]. X's shape: %s, "
2877 2878
                        "Y's shape: %s.\n" % (i, i, x_shape, y_shape)
                    )
S
ShenLiang 已提交
2879

W
wanghuancoder 已提交
2880 2881 2882 2883 2884 2885
    attrs = {
        'transpose_X': transpose_x,
        'transpose_Y': transpose_y,
        'alpha': float(alpha),
    }

S
ShenLiang 已提交
2886 2887 2888 2889
    __check_input(x, y)

    helper = LayerHelper('matmul', **locals())
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
2890 2891 2892 2893 2894 2895
    helper.append_op(
        type='matmul',
        inputs={'X': x, 'Y': y},
        outputs={'Out': out},
        attrs=attrs,
    )
S
ShenLiang 已提交
2896
    return out
2897 2898


2899
def topk(input, k, name=None):
Q
qingqing01 已提交
2900
    """
2901
    :alias_main: paddle.topk
2902 2903
        :alias: paddle.topk,paddle.tensor.topk,paddle.tensor.search.topk
        :old_api: paddle.fluid.layers.topk
2904

2905
    This OP is used to find values and indices of the k largest entries
Q
qingqing01 已提交
2906 2907
    for the last dimension.

2908 2909
    If the input is a 1-D Tensor, finds the k largest entries and outputs
    their values and indices.
Q
qingqing01 已提交
2910 2911 2912 2913

    If the input is a Tensor with higher rank, this operator computes the top k
    entries along the last dimension.

F
fengjiayi 已提交
2914 2915
    .. code-block:: text

2916 2917 2918 2919 2920
        Case 1:

          Input:
            input.shape = [3, 4]
            input.data = [[5, 4, 2, 3],
F
fengjiayi 已提交
2921 2922 2923 2924
                     [9, 7, 10, 25],
                     [6, 2, 10, 1]]
            k = 2

2925
          Output:
F
fengjiayi 已提交
2926
            The first output:
2927 2928
            values.shape = [3, 2]
            values.data = [[5, 4],
F
fengjiayi 已提交
2929 2930 2931 2932
                      [10, 25],
                      [6, 10]]

            The second output:
2933 2934
            indices.shape = [3, 2]
            indices.data = [[0, 1],
F
fengjiayi 已提交
2935 2936 2937
                       [2, 3],
                       [0, 2]]

Q
qingqing01 已提交
2938
    Args:
2939 2940 2941 2942
        input(Variable): The input tensor. Support data types: float32, float64.
        k(int | Variable): The number of top elements to look for along the last dimension
                           of input tensor.
        name (str, optional): Please refer to :ref:`api_guide_Name`, Default None.
Q
qingqing01 已提交
2943 2944

    Returns:
2945 2946
        Values (Variable): Input tensor's k largest elements along each last dimensional slice. The dimension is: :math:`input.shape[:-1]+[k]`.
        Indices (Variable): Indices of k largest elements alone the last dimension of input. The dimension is same as values.
Q
qingqing01 已提交
2947

F
fengjiayi 已提交
2948
    Raises:
2949
        ValueError: If :math:`k < 1` or :math:`k > last dimension of input`.
Q
qingqing01 已提交
2950 2951 2952 2953

    Examples:
        .. code-block:: python

2954
            import paddle.fluid as fluid
2955
            import paddle.fluid.layers as layers
2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968
            # set batch size=None
            input = fluid.data(name="input", shape=[None, 13, 11], dtype='float32')
            top5_values, top5_indices = layers.topk(input, k=5) # top5_values.shape[None, 13, 5], top5_indices.shape=[None, 13, 5]

            # 1D Tensor
            input1 = fluid.data(name="input1", shape=[None, 13], dtype='float32')
            top5_values, top5_indices = layers.topk(input1, k=5) #top5_values.shape=[None, 5], top5_indices.shape=[None, 5]

            # k=Variable
            input2 = fluid.data(name="input2", shape=[None, 13, 11], dtype='float32')
            vk = fluid.data(name="vk", shape=[None, 1], dtype='int32') # save k in vk.data[0]
            vk_values, vk_indices = layers.topk(input2, k=vk) #vk_values.shape=[None, 13, k], vk_indices.shape=[None, 13, k]

Q
qingqing01 已提交
2969
    """
J
Jiabin Yang 已提交
2970
    if _non_static_mode():
2971
        _k = k.numpy().item(0) if isinstance(k, Variable) else k
2972
        out, indices = _legacy_C_ops.top_k(input, 'k', _k)
2973 2974 2975
        out.stop_gradient = True
        indices.stop_gradient = True
        return out, indices
2976

2977 2978
    inputs = {"X": [input]}
    attrs = {}
S
songyouwei 已提交
2979 2980 2981 2982 2983
    if isinstance(k, Variable):
        inputs['K'] = [k]
    else:
        attrs = {'k': k}

2984 2985 2986 2987
    helper = LayerHelper("top_k", **locals())
    values = helper.create_variable_for_type_inference(dtype=input.dtype)
    indices = helper.create_variable_for_type_inference(dtype="int64")

2988 2989 2990 2991 2992 2993
    helper.append_op(
        type="top_k",
        inputs=inputs,
        outputs={"Out": [values], "Indices": [indices]},
        attrs=attrs,
    )
Q
qingqing01 已提交
2994 2995 2996 2997 2998
    values.stop_gradient = True
    indices.stop_gradient = True
    return values, indices


2999 3000 3001
def ctc_greedy_decoder(
    input, blank, input_length=None, padding_value=0, name=None
):
3002
    r"""
S
SunGaofeng 已提交
3003
    This op is used to decode sequences by greedy policy by the following steps:
Y
yi.wu 已提交
3004

S
SunGaofeng 已提交
3005
    1. Get the indexes of maximum value for each row in input. a.k.a.
Y
ying 已提交
3006 3007 3008
       numpy.argmax(input, axis=0).
    2. For each sequence in result of step1, merge repeated tokens between two
       blanks and delete all blanks.
3009

S
SunGaofeng 已提交
3010
    This op is implemented in two modes: lod and padding, either of them can be used.
3011
    The input can be either LoDTensor or Tensor, corresponding to lod and padding
S
SunGaofeng 已提交
3012 3013
    mode respectively.

3014 3015 3016 3017 3018
    A simple example as below:

    .. code-block:: text

        Given:
S
SunGaofeng 已提交
3019
        (1) for lod mode:
3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030

        input.data = [[0.6, 0.1, 0.3, 0.1],
                      [0.3, 0.2, 0.4, 0.1],
                      [0.1, 0.5, 0.1, 0.3],
                      [0.5, 0.1, 0.3, 0.1],

                      [0.5, 0.1, 0.3, 0.1],
                      [0.2, 0.2, 0.2, 0.4],
                      [0.2, 0.2, 0.1, 0.5],
                      [0.5, 0.1, 0.3, 0.1]]

3031
        input.lod = [[4, 4]]
M
minqiyang 已提交
3032

W
whs 已提交
3033
        Computation:
3034

W
whs 已提交
3035 3036 3037 3038 3039 3040
        step1: Apply argmax to first input sequence which is input.data[0:4]. Then we get:
               [[0], [2], [1], [0]]
        step2: merge repeated tokens and remove blank which is 0. Then we get first output sequence:
               [[2], [1]]

        Finally:
3041 3042 3043 3044 3045

        output.data = [[2],
                       [1],
                       [3]]

3046
        output.lod = [[2, 1]]
3047

S
SunGaofeng 已提交
3048
        (2) for padding mode:
3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064

         input.data = [[[0.6, 0.1, 0.3, 0.1],
                        [0.3, 0.2, 0.4, 0.1],
                        [0.1, 0.5, 0.1, 0.3],
                        [0.5, 0.1, 0.3, 0.1]],

                       [[0.5, 0.1, 0.3, 0.1],
                        [0.2, 0.2, 0.2, 0.4],
                        [0.2, 0.2, 0.1, 0.5],
                        [0.5, 0.1, 0.3, 0.1]]]

        input_length.data = [[4], [4]]
        input.shape = [2, 4, 4]

        step1: Apply argmax to first input sequence which is input.data[0:4]. Then we get:
               [[0], [2], [1], [0]], for input.data[4:8] is [[0], [3], [3], [0]], shape is [2,4,1]
3065
        step2: Change the argmax result to use padding mode, then argmax result is
3066 3067 3068 3069 3070 3071 3072 3073 3074
                [[0, 2, 1, 0], [0, 3, 3, 0]], shape is [2, 4], lod is [], input_length is [[4], [4]]
        step3: Apply ctc_align to padding argmax result, padding_value is 0

        Finally:
        output.data = [[2, 1, 0, 0],
                       [3, 0, 0, 0]]
        output_length.data = [[2], [1]]


S
SunGaofeng 已提交
3075
    Parameters:
3076

3077 3078
        input(Variable): the probabilities of variable-length sequences. When in lod mode,
                         it is a 2-D LoDTensor with LoD information. It's shape is [Lp, num_classes + 1]
Y
ying 已提交
3079
                         where Lp is the sum of all input sequences' length and
3080 3081
                         num_classes is the true number of classes. When in padding mode,
                         it is a 3-D Tensor with padding, It's shape is [batch_size, N, num_classes + 1].
S
SunGaofeng 已提交
3082
                         (not including the blank label). The data type can be float32 or float64.
Y
ying 已提交
3083
        blank(int): the blank label index of Connectionist Temporal
S
SunGaofeng 已提交
3084
                    Classification (CTC) loss, which is in the half-opened
Y
ying 已提交
3085
                    interval [0, num_classes + 1).
S
SunGaofeng 已提交
3086 3087
        input_length(Variable, optional): 2-D LoDTensor, shape is [batch_size, 1], data type is int64.
                                 It is used for padding mode. In lod mode, input_length is None.
3088
        padding_value(int): padding value.
3089 3090 3091
        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`
3092 3093

    Returns:
S
SunGaofeng 已提交
3094 3095 3096 3097 3098
        For lod mode, returns the result of CTC greedy decoder, 2-D LoDTensor, shape is [Lp, 1], \
        data type is int64. 'Lp' is the sum of all output sequences' length. If all the sequences \
        in result were empty, the result LoDTensor will be [-1] with  empty \
        LoD [[]].

3099
        For padding mode, returns a tuple of (output, output_length), which was described as below:
S
SunGaofeng 已提交
3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110

        output, 2-D Tensor, shape is [batch_size, N], data type is int64.

        output_length, 2-D Tensor, shape is [batch_size, 1], data type is int64. It is the length of \
                           each sequence of output for padding mode.

    Return type:
        For lod mode: Variable

        For padding mode: tuple of two Variables (output, output_length).

3111 3112 3113 3114

    Examples:
        .. code-block:: python

3115
            # for lod mode
S
SunGaofeng 已提交
3116
            import paddle.fluid as fluid
S
SunGaofeng 已提交
3117
            x = fluid.data(name='x', shape=[None, 8], dtype='float32', lod_level=1)
3118
            cost = fluid.layers.ctc_greedy_decoder(input=x, blank=0)
3119 3120

            # for padding mode
S
SunGaofeng 已提交
3121 3122
            x_pad = fluid.data(name='x_pad', shape=[10, 4, 8], dtype='float32')
            x_pad_len = fluid.data(name='x_pad_len', shape=[10, 1], dtype='int64')
3123 3124 3125
            out, out_len = fluid.layers.ctc_greedy_decoder(input=x_pad, blank=0,
                            input_length=x_pad_len)

W
wanghaoshuang 已提交
3126
    """
3127 3128 3129
    check_variable_and_dtype(
        input, 'input', ['float32', 'float64'], 'ctc_greedy_decoder'
    )
3130

3131
    helper = LayerHelper("ctc_greedy_decoder", **locals())
Q
qingqing01 已提交
3132
    _, topk_indices = topk(input, k=1)
3133 3134

    # ctc align op
X
Xin Pan 已提交
3135
    ctc_out = helper.create_variable_for_type_inference(dtype="int64")
3136 3137

    if input_length is None:
3138 3139 3140 3141 3142 3143
        helper.append_op(
            type="ctc_align",
            inputs={"Input": [topk_indices]},
            outputs={"Output": [ctc_out]},
            attrs={"merge_repeated": True, "blank": blank},
        )
3144 3145 3146
        return ctc_out
    else:
        ctc_out_len = helper.create_variable_for_type_inference(dtype="int64")
3147
        ctc_input = paddle.squeeze(topk_indices, [2])
3148

3149 3150 3151 3152 3153 3154 3155 3156 3157 3158
        helper.append_op(
            type="ctc_align",
            inputs={"Input": [ctc_input], "InputLength": [input_length]},
            outputs={"Output": [ctc_out], "OutputLength": [ctc_out_len]},
            attrs={
                "merge_repeated": True,
                "blank": blank,
                "padding_value": padding_value,
            },
        )
3159
        return ctc_out, ctc_out_len
3160 3161


3162 3163 3164 3165 3166 3167 3168 3169 3170
def im2sequence(
    input,
    filter_size=1,
    stride=1,
    padding=0,
    input_image_size=None,
    out_stride=1,
    name=None,
):
3171
    r"""
3172 3173
    :api_attr: Static Graph

3174
    Extracts image patches from the input tensor to form a tensor of shape
L
Liufang Sang 已提交
3175 3176 3177
    {input.batch_size * output_height * output_width, filter_size_height *
    filter_size_width * input.channels}. This op use filter to scan images
    and convert these images to sequences. After expanding, the number of time step are
3178 3179
    output_height * output_width for an image, in which output_height and
    output_width are calculated by below equation:
3180 3181 3182

    .. math::

L
Liufang Sang 已提交
3183 3184 3185 3186
        output\_height  = 1 + \
            (padding\_up + padding\_down + input\_height  - filter\_size\_height  + stride\_height - 1) / stride\_height \\\\
        output\_width  = 1 + \
            (padding\_left + padding\_right + input\_width  - filter\_size\_width  + stride\_width - 1) / stride\_width
3187

L
Liufang Sang 已提交
3188
    And the dimension of each time step is filter_size_height * filter_size_width * input.channels.
3189

L
Liufang Sang 已提交
3190 3191
    Parameters:
        input (Variable): The input should be a 4-D Tensor in :math:`NCHW` format. The data type is float32.
W
wanghaoshuang 已提交
3192

L
Liufang Sang 已提交
3193 3194 3195
        filter_size(int32 | List[int32]): The filter size. If filter_size is a List,
            it must contain two integers, :math:`[filter\_size\_height, filter\_size\_width]` .
            Otherwise, the filter size will be a square :math:`[filter\_size, filter\_size]` . Default is 1.
3196

L
Liufang Sang 已提交
3197 3198
        stride(int32 | List[int32]): The stride size. If stride is a List, it must
            contain two integers, :math:`[stride\_height, stride\_width]` . Otherwise, the stride size will be a square :math:`[stride\_size, stride\_size]` . Default is 1.
3199

L
Liufang Sang 已提交
3200 3201 3202 3203 3204
        padding(int32 | List[int32]): The padding size. If padding is a List, it can
            contain four integers like :math:`[padding\_up, padding\_left, padding\_down, padding\_right]` to indicate
            paddings of four direction.  Or it can contain two integers :math:`[padding\_height, padding\_width]` which means
            padding_up = padding_down = padding_height and
            padding_left = padding_right = padding_width. Otherwise, a scalar padding means
3205
            padding_up = padding_down = padding_left = padding_right = padding.
L
Liufang Sang 已提交
3206
            Default is 0.
3207

L
Liufang Sang 已提交
3208 3209 3210 3211
        input_image_size(Variable, optional): the input contains image real size.It's dim
            is :math:`[batchsize, 2]` . It is just for batch inference when not None. Default is None.

        out_stride(int32 | List[int32]): The scaling of image through CNN. It is valid only when input_image_size is not None.
T
tianshuo78520a 已提交
3212
            If out_stride is List,  it must contain two integers,
L
Liufang Sang 已提交
3213 3214 3215 3216 3217
            :math:`[out\_stride\_height, out\_stride\_W]` . Otherwise,
            the out_stride_height = out_stride_width = out_stride. Default is 1.

        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` .
3218 3219 3220

    Returns:
            The output is a 2-D LoDTensor with shape {input.batch\_size * output\_height * output\_width, \
L
Liufang Sang 已提交
3221 3222 3223
            filter\_size\_height * filter\_size\_width * input.channels}. The data type is float32.

    Return Type: Variable
3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250

    Examples:

        .. code-block:: text

            Given:

            x = [[[[ 6.  2.  1.]
                   [ 8.  3.  5.]
                   [ 0.  2.  6.]]

                  [[ 2.  4.  4.]
                   [ 6.  3.  0.]
                   [ 6.  4.  7.]]]

                 [[[ 6.  7.  1.]
                   [ 5.  7.  9.]
                   [ 2.  4.  8.]]

                  [[ 1.  2.  1.]
                   [ 1.  3.  5.]
                   [ 9.  0.  8.]]]]

            x.dims = {2, 2, 3, 3}

            And:

W
wanghaoshuang 已提交
3251 3252 3253
            filter = [2, 2]
            stride = [1, 1]
            padding = [0, 0]
3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265

            Then:

            output.data = [[ 6.  2.  8.  3.  2.  4.  6.  3.]
                           [ 2.  1.  3.  5.  4.  4.  3.  0.]
                           [ 8.  3.  0.  2.  6.  3.  6.  4.]
                           [ 3.  5.  2.  6.  3.  0.  4.  7.]
                           [ 6.  7.  5.  7.  1.  2.  1.  3.]
                           [ 7.  1.  7.  9.  2.  1.  3.  5.]
                           [ 5.  7.  2.  4.  1.  3.  9.  0.]
                           [ 7.  9.  4.  8.  3.  5.  0.  8.]]

3266
            output.dims = {8, 8}
3267

3268
            output.lod = [[4, 4]]
3269

T
Tink_Y 已提交
3270
    Examples:
3271 3272 3273

        .. code-block:: python

B
Bai Yifan 已提交
3274
            import paddle.fluid as fluid
3275 3276
            import paddle
            paddle.enable_static()
L
Liufang Sang 已提交
3277
            data = fluid.data(name='data', shape=[None, 3, 32, 32],
B
Bai Yifan 已提交
3278
                                     dtype='float32')
3279
            output = fluid.layers.im2sequence(
B
Bai Yifan 已提交
3280 3281
                input=data, stride=[1, 1], filter_size=[2, 2])

3282 3283

    """
3284 3285 3286
    assert (
        not _non_static_mode()
    ), "sequence layer is not supported in dygraph mode yet."
W
wanghaoshuang 已提交
3287

3288 3289
    check_variable_and_dtype(input, 'input', ['float32'], 'im2sequence')

W
wanghaoshuang 已提交
3290 3291 3292 3293 3294 3295 3296 3297 3298
    if isinstance(filter_size, int):
        filter_size = [filter_size, filter_size]
    if isinstance(stride, int):
        stride = [stride, stride]
    if isinstance(padding, int):
        padding = [padding, padding]
    if len(padding) == 2:
        padding.append(padding[0])
        padding.append(padding[1])
3299
    inputs = {"X": input}
3300
    attrs = {"kernels": filter_size, "strides": stride, "paddings": padding}
3301 3302 3303 3304 3305
    if input_image_size:
        if isinstance(out_stride, int):
            out_stride = [out_stride, out_stride]
        inputs["Y"] = input_image_size
        attrs["out_stride"] = out_stride
3306
    helper = LayerHelper('im2sequence', **locals())
X
Xin Pan 已提交
3307
    out = helper.create_variable_for_type_inference(dtype=helper.input_dtype())
3308 3309 3310
    helper.append_op(
        type='im2sequence', inputs=inputs, outputs={'Out': out}, attrs=attrs
    )
3311
    return out
3312 3313


Y
yuyang18 已提交
3314
@templatedoc()
3315
def row_conv(input, future_context_size, param_attr=None, act=None):
Y
yuyang18 已提交
3316
    """
3317 3318
    :api_attr: Static Graph

Y
yuyang18 已提交
3319
    ${comment}
3320 3321

    Args:
Y
yuyang18 已提交
3322
        input (${x_type}): ${x_comment}.
Y
yangyaming 已提交
3323 3324
        future_context_size (int): Future context size. Please note, the shape
            of convolution kernel is [future_context_size + 1, D].
3325 3326 3327 3328 3329
        param_attr (ParamAttr): Attributes of parameters, including
            name, initializer etc.
        act (str): Non-linear activation to be applied to output variable.

    Returns:
Y
yuyang18 已提交
3330
        ${out_comment}.
3331 3332

    Examples:
B
Bai Yifan 已提交
3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344

      .. code-block:: python

        # for LodTensor inputs
        import paddle
        paddle.enable_static()
        x = paddle.static.data(name='x', shape=[9, 16],
                               dtype='float32', lod_level=1)
        out = paddle.static.nn.row_conv(input=x, future_context_size=2)
        # for Tensor inputs
        x = paddle.static.data(name='x', shape=[9, 4, 16], dtype='float32')
        out = paddle.static.nn.row_conv(input=x, future_context_size=2)
3345 3346
    """
    helper = LayerHelper('row_conv', **locals())
3347
    check_variable_and_dtype(input, 'input', ['float32'], 'row_conv')
3348
    dtype = helper.input_dtype()
3349
    filter_shape = [future_context_size + 1, input.shape[-1]]
3350 3351 3352
    filter_param = helper.create_parameter(
        attr=helper.param_attr, shape=filter_shape, dtype=dtype
    )
X
Xin Pan 已提交
3353
    out = helper.create_variable_for_type_inference(dtype)
3354 3355 3356 3357 3358
    helper.append_op(
        type='row_conv',
        inputs={'X': [input], 'Filter': [filter_param]},
        outputs={'Out': [out]},
    )
Y
yangyaming 已提交
3359
    return helper.append_activation(out)
3360 3361


Y
yuyang18 已提交
3362
@templatedoc()
3363
def multiplex(inputs, index, name=None):
3364
    """
Y
yuyang18 已提交
3365

3366
    Based on the given index parameter, the OP selects a specific row from each input Tensor to construct the output Tensor.
L
lujun 已提交
3367

3368
    If the input of this OP contains :math:`m` Tensors, where :math:`I_{i}` means the i-th input Tensor, :math:`i` between :math:`[0,m)` .
L
lujun 已提交
3369

3370
    And :math:`O` means the output, where :math:`O[i]` means the i-th row of the output, then the output satisfies that :math:`O[i] = I_{index[i]}[i]` .
L
lujun 已提交
3371

3372
    For Example:
L
lujun 已提交
3373

3374
            .. code-block:: text
L
lujun 已提交
3375

3376
                Given:
L
lujun 已提交
3377

3378 3379 3380 3381
                inputs = [[[0,0,3,4], [0,1,3,4], [0,2,4,4], [0,3,3,4]],
                          [[1,0,3,4], [1,1,7,8], [1,2,4,2], [1,3,3,4]],
                          [[2,0,3,4], [2,1,7,8], [2,2,4,2], [2,3,3,4]],
                          [[3,0,3,4], [3,1,7,8], [3,2,4,2], [3,3,3,4]]]
L
lujun 已提交
3382

3383
                index = [[3],[0],[1],[2]]
L
lujun 已提交
3384

3385 3386 3387 3388
                out = [[3,0,3,4],    # out[0] = inputs[index[0]][0] = inputs[3][0] = [3,0,3,4]
                       [0,1,3,4],    # out[1] = inputs[index[1]][1] = inputs[0][1] = [0,1,3,4]
                       [1,2,4,2],    # out[2] = inputs[index[2]][2] = inputs[1][2] = [1,2,4,2]
                       [2,3,3,4]]    # out[3] = inputs[index[3]][3] = inputs[2][3] = [2,3,3,4]
L
lujun 已提交
3389 3390


3391
    Args:
3392 3393 3394 3395 3396
        inputs (list): The input Tensor list. The list elements are N-D Tensors of data types float32, float64, int32, int64. All input Tensor shapes should be the same and rank must be at least 2.
        index (Tensor): Used to select some rows in the input Tensor to construct an index of the output Tensor. It is a 2-D Tensor with data type int32 or int64 and shape [M, 1], where M is the number of input Tensors.
        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`.
3397
    Returns:
3398
        Tensor: Output of multiplex OP, with data type being float32, float64, int32, int64.
X
xuezhong 已提交
3399 3400

    Examples:
3401

X
xuezhong 已提交
3402 3403
        .. code-block:: python

3404
            import paddle
3405 3406 3407
            import numpy as np
            img1 = np.array([[1, 2], [3, 4]]).astype(np.float32)
            img2 = np.array([[5, 6], [7, 8]]).astype(np.float32)
3408 3409 3410
            inputs = [paddle.to_tensor(img1), paddle.to_tensor(img2)]
            index = paddle.to_tensor(np.array([[1], [0]]).astype(np.int32))
            res = paddle.multiplex(inputs, index)
3411
            print(res) # [array([[5., 6.], [3., 4.]], dtype=float32)]
X
xuezhong 已提交
3412

3413
    """
3414 3415

    if _in_legacy_dygraph():
3416
        return _legacy_C_ops.multiplex(index, inputs)
3417
    if in_dygraph_mode():
3418
        return _C_ops.multiplex(inputs, index)
3419 3420
    helper = LayerHelper('multiplex', **locals())

3421 3422 3423
    check_type(inputs, 'inputs', (list), 'multiplex')
    if len(inputs) < 2:
        raise ValueError(
3424 3425
            "inputs should be a list object with at least 2 elements."
        )
3426
    for id, x in enumerate(inputs):
3427 3428 3429 3430 3431 3432
        check_variable_and_dtype(
            x,
            'input[' + str(id) + ']',
            ['float32', 'float64', 'int32', 'int64'],
            'multiplex',
        )
3433
    check_variable_and_dtype(index, "index", ['int32', 'int64'], 'multiplex')
3434 3435

    out = helper.create_variable_for_type_inference(inputs[0].dtype)
3436 3437 3438 3439 3440
    helper.append_op(
        type='multiplex',
        inputs={'X': inputs, 'Ids': index},
        outputs={'Out': [out]},
    )
3441
    return out
X
xuezhong 已提交
3442 3443


3444 3445
def smooth_l1(x, y, inside_weight=None, outside_weight=None, sigma=None):
    """
3446

Y
Yibing Liu 已提交
3447 3448
    This layer computes the smooth L1 loss for Variable :attr:`x` and :attr:`y`.
    It takes the first dimension of :attr:`x` and :attr:`y` as batch size.
Q
qingqing01 已提交
3449
    For each instance, it computes the smooth L1 loss element by element first
T
tianshuo78520a 已提交
3450
    and then sums all the losses. So the shape of output Variable is
3451
    [batch_size, 1].
3452

3453 3454
    Args:
        x (Variable): A tensor with rank at least 2. The input value of smooth
Q
qingqing01 已提交
3455
            L1 loss op with shape [batch_size, dim1, ..., dimN].
3456
            A LoDTensor or Tensor with type float32.
3457
        y (Variable): A tensor with rank at least 2. The target value of smooth
Y
Yibing Liu 已提交
3458
            L1 loss op with same shape as :attr:`x`.
3459
            A LoDTensor or Tensor with type float32.
3460
        inside_weight (Variable|None):  A tensor with rank at least 2. This
3461 3462
            input is optional and should have same shape with :attr:`x`. If
            provided, the result of (:attr:`x` - :attr:`y`) will be multiplied
Y
Yibing Liu 已提交
3463
            by this tensor element by element.
3464
            A Tensor with type float32.
3465
        outside_weight (Variable|None): A tensor with rank at least 2. This
3466 3467
            input is optional and should have same shape with :attr:`x`. If
            provided, the out smooth L1 loss will be multiplied by this tensor
Y
Yibing Liu 已提交
3468
            element by element.
3469
            A Tensor with type float32.
3470
        sigma (float|None): Hyper parameter of smooth L1 loss layer. A float
3471 3472
           scalar with default value 1.0.

3473
    Returns:
3474
        Variable: The output smooth L1 loss with shape [batch_size, 1].  A Tensor with type float32.
3475 3476 3477 3478

    Examples:
        .. code-block:: python

3479
            import paddle.fluid as fluid
3480
            import numpy as np
3481 3482
            import paddle
            paddle.enable_static()
3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493
            data = fluid.data(name="x", shape=[-1, 3], dtype="float32")
            label = fluid.data(name="y", shape=[-1, 3], dtype="float32")
            result = fluid.layers.smooth_l1(data,label)
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
            x = np.random.rand(3,3).astype("float32")
            y = np.random.rand(3,3).astype("float32")
            output= exe.run(feed={"x":x, "y":y},
                             fetch_list=[result])
            print(output)
3494

3495 3496 3497 3498
            #[array([[0.08220536],
            #       [0.36652038],
            #      [0.20541131]], dtype=float32)]

3499
    """
3500 3501
    check_variable_and_dtype(x, 'X', ['float32', 'float64'], 'smooth_l1_loss')
    check_variable_and_dtype(y, 'Y', ['float32', 'float64'], 'smooth_l1_loss')
3502

3503
    helper = LayerHelper('smooth_l1_loss', **locals())
3504

X
Xin Pan 已提交
3505 3506
    diff = helper.create_variable_for_type_inference(dtype=x.dtype)
    loss = helper.create_variable_for_type_inference(dtype=x.dtype)
3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517
    helper.append_op(
        type='smooth_l1_loss',
        inputs={
            'X': x,
            'Y': y,
            'InsideWeight': inside_weight,
            'OutsideWeight': outside_weight,
        },
        outputs={'Diff': diff, 'Out': loss},
        attrs={'sigma': sigma if sigma is not None else 1.0},
    )
3518
    return loss
3519 3520


3521
@deprecated(since='2.0.0', update_to='paddle.nn.functional.one_hot')
3522
def one_hot(input, depth, allow_out_of_range=False):
3523
    """
3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561

    **WARING:** This OP requires the last dimension of Tensor shape must be equal to 1.
    This OP will be deprecated in a future release. It is recommended to use fluid. :ref:`api_fluid_one_hot` .

    The operator converts each id in the input to an one-hot vector with a
    :attr:`depth` length. The value in the vector dimension corresponding to the id
    is 1, and the value in the remaining dimension is 0.

    The shape of output Tensor or LoDTensor is generated by adding :attr:`depth` dimension
    behind the last dimension of the input shape.

    .. code-block:: text

        Example 1 (allow_out_of_range=False):

        input:
            X.shape = [4, 1]
            X.data = [[1], [1], [3], [0]]
            depth = 4

        output:
            Out.shape = [4, 4]
            Out.data = [[0., 1., 0., 0.],
                        [0., 1., 0., 0.],
                        [0., 0., 0., 1.],
                        [1., 0., 0., 0.]]

        Example 2 (allow_out_of_range=True):

        input:
            X.shape = [4, 1]
            X.data = [[1], [1], [5], [0]]
            depth = 4
            allow_out_of_range = True

        output:
            Out.shape = [4, 4]
            Out.data = [[0., 1., 0., 0.],
3562
                        [0., 1., 0., 0.],
3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574
                        [0., 0., 0., 0.], # This id is 5, which goes beyond depth, so set it all-zeros data.
                        [1., 0., 0., 0.]]

        Example 3 (allow_out_of_range=False):

        input:
            X.shape = [4, 1]
            X.data = [[1], [1], [5], [0]]
            depth = 4
            allow_out_of_range = False

        output: Throw an exception for Illegal value
3575
            The second dimension in X is 5, which is greater than depth.
3576 3577
            Allow_out_of_range =False means that does not allow the word id to exceed depth,
            so it throws an exception.
3578 3579

    Args:
3580 3581 3582
        input(Variable): Tensor or LoDTensor with shape :math:`[N_1, N_2, ..., N_k, 1]` ,
            which contains at least one dimension and the last dimension must be 1.
            The data type is int32 or int64.
3583
        depth(scalar): An integer defining the :attr:`depth` of the one hot dimension. If input
3584
            is word id, depth is generally the dictionary size.
3585
        allow_out_of_range(bool): A bool value indicating whether the input
3586 3587 3588 3589
            indices could be out of range :math:`[0, depth)` . When input indices are
            out of range, exceptions :code:`Illegal value` is raised if :attr:`allow_out_of_range`
            is False, or zero-filling representations is created if it is set True.
            Default: False.
3590 3591

    Returns:
3592
        Variable: The one-hot representations of input. A Tensor or LoDTensor with type float32.
3593 3594

    Examples:
C
caoying03 已提交
3595
        .. code-block:: python
3596

3597
            import paddle
3598
            import paddle.fluid as fluid
3599 3600
            paddle.enable_static()

3601 3602 3603
            # Correspond to the first example above, where label.shape is [4, 1] and one_hot_label.shape is [4, 4].
            label = fluid.data(name="label", shape=[4, 1], dtype="int64")
            one_hot_label = fluid.layers.one_hot(input=label, depth=4)
3604
    """
J
Jiabin Yang 已提交
3605
    if _non_static_mode():
S
songyouwei 已提交
3606 3607 3608
        if isinstance(depth, Variable):
            depth = depth.numpy()
            assert depth.shape == (
3609 3610
                1,
            ), "depth of type Variable should have shape [1]"
3611
            depth = depth.item(0)
3612 3613 3614
        out = _legacy_C_ops.one_hot(
            input, 'depth', depth, 'allow_out_of_range', allow_out_of_range
        )
3615 3616
        out.stop_gradient = True
        return out
3617

3618
    helper = LayerHelper("one_hot", **locals())
3619
    check_variable_and_dtype(input, 'input', ['int32', 'int64'], 'one_hot')
3620
    check_type(depth, 'depth', (int, Variable), 'one_hot')
X
Xin Pan 已提交
3621
    one_hot_out = helper.create_variable_for_type_inference(dtype='float32')
3622

3623 3624
    if not isinstance(depth, Variable):
        # user attribute
3625
        inputs = {'X': input}
Y
Yi Liu 已提交
3626
        attrs = {'depth': depth, 'allow_out_of_range': allow_out_of_range}
3627
    else:
3628 3629 3630
        depth.stop_gradient = True
        inputs = {'X': input, 'depth_tensor': depth}
        attrs = {'allow_out_of_range': allow_out_of_range}
3631 3632 3633
    helper.append_op(
        type="one_hot", inputs=inputs, attrs=attrs, outputs={'Out': one_hot_out}
    )
3634
    one_hot_out.stop_gradient = True
3635
    return one_hot_out
Y
Yu Yang 已提交
3636 3637


Y
Yu Yang 已提交
3638
def autoincreased_step_counter(counter_name=None, begin=1, step=1):
Y
Yu Yang 已提交
3639
    """
3640 3641
    :api_attr: Static Graph

3642 3643
    Create an auto-increase variable. which will be automatically increased
    by 1 in every iteration. By default, the first return of this counter is 1,
Y
Yibing Liu 已提交
3644
    and the step size is 1.
Y
Yu Yang 已提交
3645 3646

    Args:
Y
Yibing Liu 已提交
3647 3648 3649
        counter_name(str, optional): The counter name. Default '@STEP_COUNTER@'.
        begin(int, optional): The first return value of this counter. Default 1.
        step(int, optional): The step size. Default 1.
Y
Yu Yang 已提交
3650

3651
    Returns:
Y
Yibing Liu 已提交
3652
        Variable: The auto-increased Variable with data type int64.
Y
yi.wu 已提交
3653 3654 3655 3656

    Examples:
        .. code-block:: python

3657
           import paddle.fluid as fluid
3658 3659
           import paddle
           paddle.enable_static()
Y
yi.wu 已提交
3660
           global_step = fluid.layers.autoincreased_step_counter(
Y
Yibing Liu 已提交
3661
               counter_name='@LR_DECAY_COUNTER@', begin=0, step=1)
Y
Yu Yang 已提交
3662 3663
    """
    helper = LayerHelper('global_step_counter')
Y
Yu Yang 已提交
3664 3665
    if counter_name is None:
        counter_name = '@STEP_COUNTER@'
Y
Yu Yang 已提交
3666
    counter, is_new_var = helper.create_or_get_global_variable(
H
hong 已提交
3667 3668 3669 3670
        name=counter_name,
        dtype='int64',
        shape=[1],
        persistable=True,
3671 3672
        belong_to_optimizer=True,
    )
Y
Yu Yang 已提交
3673
    if is_new_var:
3674 3675 3676
        helper.set_variable_initializer(
            counter, initializer=Constant(value=begin - 1, force_cpu=True)
        )
W
Wu Yi 已提交
3677
        helper.main_program.global_block()._prepend_op(
Y
Yu Yang 已提交
3678 3679
            type='increment',
            inputs={'X': [counter]},
Y
Yu Yang 已提交
3680
            outputs={'Out': [counter]},
3681 3682
            attrs={'step': float(step)},
        )
Y
Yu Yang 已提交
3683 3684 3685
        counter.stop_gradient = True

    return counter
Y
yangyaming 已提交
3686 3687


3688
def unsqueeze(input, axes, name=None):
Y
Yibing Liu 已提交
3689
    """
3690
    Insert single-dimensional entries to the shape of a Tensor. Takes one
M
minqiyang 已提交
3691 3692
    required argument axes, a list of dimensions that will be inserted.
    Dimension indices in axes are as seen in the output tensor.
Y
Yibing Liu 已提交
3693

M
minqiyang 已提交
3694
    For example:
H
haowang101779990 已提交
3695 3696 3697

    .. code-block:: text

M
minqiyang 已提交
3698
      Given a tensor such that tensor with shape [3, 4, 5],
Y
Yibing Liu 已提交
3699
      then Unsqueezed tensor with axes=[0, 4] has shape [1, 3, 4, 5, 1].
M
minqiyang 已提交
3700

Y
Yibing Liu 已提交
3701
    Args:
3702
        input (Variable): The input Tensor to be unsqueezed. Supported data type: float32, float64, bool, int8, int32, int64.
3703
        axes (int|list|tuple|Variable): Indicates the dimensions to be inserted. The data type is ``int32`` . If ``axes`` is a list or tuple, the elements of it should be integers or Tensors with shape [1]. If ``axes`` is an Variable, it should be an 1-D Tensor .
3704
        name (str|None): Name for this layer.
Y
Yibing Liu 已提交
3705 3706

    Returns:
3707
        Variable: Unsqueezed Tensor, with the same data type as input.
Y
Yibing Liu 已提交
3708 3709 3710 3711

    Examples:
        .. code-block:: python

3712 3713 3714
            import paddle.fluid as fluid
            x = fluid.layers.data(name='x', shape=[5, 10])
            y = fluid.layers.unsqueeze(input=x, axes=[1])
3715

Y
Yibing Liu 已提交
3716
    """
J
Jiabin Yang 已提交
3717
    if _non_static_mode():
L
Leo Chen 已提交
3718 3719 3720
        if isinstance(axes, int):
            axes = [axes]
        elif isinstance(axes, Variable):
3721
            axes = axes.numpy().tolist()
L
Leo Chen 已提交
3722 3723 3724 3725 3726
        elif isinstance(axes, (list, tuple)):
            axes = [
                item.numpy().item(0) if isinstance(item, Variable) else item
                for item in axes
            ]
3727
        if _in_legacy_dygraph():
3728
            out, _ = _legacy_C_ops.unsqueeze2(input, 'axes', axes)
3729
            return out
3730
        return _C_ops.unsqueeze(input, axes)
3731 3732

    check_type(axes, 'axis/axes', (int, list, tuple, Variable), 'unsqueeze')
3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749
    check_variable_and_dtype(
        input,
        'input',
        [
            'float16',
            'float32',
            'float64',
            'bool',
            'int8',
            'int16',
            'int32',
            'int64',
            'complex64',
            'complex128',
        ],
        'unsqueeze',
    )
3750 3751 3752 3753 3754 3755 3756 3757 3758 3759
    helper = LayerHelper("unsqueeze2", **locals())
    inputs = {"X": input}
    attrs = {}

    if isinstance(axes, int):
        axes = [axes]
    if isinstance(axes, Variable):
        axes.stop_gradient = True
        inputs["AxesTensor"] = axes
    elif isinstance(axes, (list, tuple)):
L
Leo Chen 已提交
3760
        if utils._contain_var(axes):
3761
            inputs["AxesTensorList"] = utils._convert_to_tensor_list(axes)
3762 3763 3764
        else:
            attrs["axes"] = axes

X
Xin Pan 已提交
3765 3766
    out = helper.create_variable_for_type_inference(dtype=input.dtype)
    x_shape = helper.create_variable_for_type_inference(dtype=input.dtype)
3767 3768 3769 3770 3771 3772
    helper.append_op(
        type="unsqueeze2",
        inputs=inputs,
        attrs=attrs,
        outputs={"Out": out, "XShape": x_shape},
    )
Y
Yibing Liu 已提交
3773

3774 3775
    return out

3776

Y
yangyaming 已提交
3777
def lod_reset(x, y=None, target_lod=None):
Y
yangyaming 已提交
3778
    """
Y
Yibing Liu 已提交
3779
    Set LoD of :attr:`x` to a new one specified by :attr:`y` or
3780 3781 3782 3783
    :attr:`target_lod`. When :attr:`y` provided, :attr:`y.lod` would be
    considered as target LoD first, otherwise :attr:`y.data` would be
    considered as target LoD. If :attr:`y` is not provided, target LoD should
    be specified by :attr:`target_lod`. If target LoD is specified by
3784
    :attr:`y.data` or :attr:`target_lod`, only one level LoD is supported.
Y
yangyaming 已提交
3785 3786 3787 3788 3789 3790

    .. code-block:: text

        * Example 1:

            Given a 1-level LoDTensor x:
3791
                x.lod =  [[ 2,           3,                   1 ]]
Y
yangyaming 已提交
3792 3793 3794
                x.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                x.dims = [6, 1]

3795
            target_lod: [4, 2]
Y
yangyaming 已提交
3796 3797

            then we get a 1-level LoDTensor:
3798
                out.lod =  [[4,                          2]]
Y
yangyaming 已提交
3799 3800 3801 3802 3803 3804
                out.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                out.dims = [6, 1]

        * Example 2:

            Given a 1-level LoDTensor x:
3805
                x.lod =  [[2,            3,                   1]]
Y
yangyaming 已提交
3806 3807 3808 3809
                x.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                x.dims = [6, 1]

            y is a Tensor:
3810
                y.data = [[2, 4]]
Y
yangyaming 已提交
3811 3812 3813
                y.dims = [1, 3]

            then we get a 1-level LoDTensor:
3814
                out.lod =  [[2,            4]]
Y
yangyaming 已提交
3815 3816 3817 3818 3819 3820
                out.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                out.dims = [6, 1]

        * Example 3:

            Given a 1-level LoDTensor x:
3821
                x.lod =  [[2,            3,                   1]]
Y
yangyaming 已提交
3822 3823 3824 3825
                x.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                x.dims = [6, 1]

            y is a 2-level LoDTensor:
3826
                y.lod =  [[2, 2], [2, 2, 1, 1]]
Y
yangyaming 已提交
3827 3828 3829 3830
                y.data = [[1.1], [2.1], [3.1], [4.1], [5.1], [6.1]]
                y.dims = [6, 1]

            then we get a 2-level LoDTensor:
3831
                out.lod =  [[2, 2], [2, 2, 1, 1]]
Y
yangyaming 已提交
3832 3833 3834 3835
                out.data = [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]]
                out.dims = [6, 1]

    Args:
3836
        x (Variable): Input variable which could be a Tensor or LoDTensor.
3837
                      The data type should be int32, int64, float32 or float64.
3838 3839
        y (Variable, optional): If provided, output's LoD would be derived from :attr:`y`.
                                If y's lod level>0, the data type can be any type.
3840 3841
                                If y's lod level=0, the data type should be int32.
        target_lod (list|tuple, optional): One level LoD which should be considered
Y
Yibing Liu 已提交
3842
                                      as target LoD when :attr:`y` not provided.
Y
yangyaming 已提交
3843 3844

    Returns:
Y
Yibing Liu 已提交
3845
        Variable: Output variable with LoD specified by this layer.
Y
yangyaming 已提交
3846 3847

    Raises:
Y
Yibing Liu 已提交
3848
        ValueError: If :attr:`y` and :attr:`target_lod` are both None.
Y
yangyaming 已提交
3849 3850 3851 3852

    Examples:
        .. code-block:: python

3853
            import paddle.fluid as fluid
3854 3855 3856
            x = fluid.layers.data(name='x', shape=[10])
            y = fluid.layers.data(name='y', shape=[10, 20], lod_level=2)
            out = fluid.layers.lod_reset(x=x, y=y)
Y
yangyaming 已提交
3857
    """
3858 3859 3860
    check_variable_and_dtype(
        x, 'x', ['float32', 'float64', 'int32', 'int64'], 'lod_reset'
    )
Y
yangyaming 已提交
3861
    helper = LayerHelper("lod_reset", **locals())
X
Xin Pan 已提交
3862
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
Y
yangyaming 已提交
3863
    if y is not None:
3864
        check_type(y, 'y', (Variable), 'lod_reset')
3865 3866 3867 3868
        # TODO: check y.lod_level = 0 dtype
        helper.append_op(
            type="lod_reset", inputs={'X': x, 'Y': y}, outputs={'Out': out}
        )
Y
yangyaming 已提交
3869
    elif target_lod is not None:
3870 3871 3872 3873 3874 3875
        helper.append_op(
            type="lod_reset",
            inputs={'X': x},
            attrs={'target_lod': target_lod},
            outputs={'Out': out},
        )
Y
yangyaming 已提交
3876
    else:
3877 3878 3879 3880
        raise ValueError("y and target_lod should not be both none.")
    return out


3881
def pad(x, paddings, pad_value=0.0, name=None):
3882
    r"""
3883
    :alias_main: paddle.nn.functional.pad
3884 3885
        :alias: paddle.nn.functional.pad,paddle.nn.functional.common.pad
        :old_api: paddle.fluid.layers.pad
3886

S
SunGaofeng 已提交
3887 3888
    This op will pad a tensor with a constant value given by :attr:`pad_value`, and the
    padded shape is specified by :attr:`paddings`.
G
guosheng 已提交
3889

S
SunGaofeng 已提交
3890 3891 3892 3893
    Specifically, the number of values padded before the elements of :attr:`x`
    in dimension :attr:`i` is indicated by :attr:`paddings[2*i]`, and the number
    of values padded after the elements of :attr:`x` in dimension :attr:`i` is
    indicated by :attr:`paddings[2*i+1]`.
G
guosheng 已提交
3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911

    See below for an example.

    .. code-block:: text

        Given:
            x = [[1, 2], [3, 4]]

            paddings = [0, 1, 1, 2]

            pad_value = 0

        Return:
            out = [[0, 1, 2, 0, 0]
                   [0, 3, 4, 0, 0]
                   [0, 0, 0, 0, 0]]

    Args:
S
SunGaofeng 已提交
3912
        x (Variable): Tensor, data type is float32.
G
guosheng 已提交
3913
        paddings (list): A list of integers. Its elements specify the padded
S
SunGaofeng 已提交
3914
                         width before and after each dimension in turn.
3915
                         The length of :attr:`paddings` must be equal to
G
guosheng 已提交
3916 3917
                         :math:`rank(x) \\times 2`.
        pad_value (float): The constant value used to pad.
3918 3919
        name(str, optional): The default value is None.
                             Normally there is no need for user to set this property.
S
SunGaofeng 已提交
3920
                             For more information, please refer to :ref:`api_guide_Name`
G
guosheng 已提交
3921 3922

    Returns:
S
SunGaofeng 已提交
3923 3924 3925 3926
        The padded tensor, with the same data type and rank as :attr:`x`

    Return Type:
        Variable
G
guosheng 已提交
3927 3928 3929

    Examples:
        .. code-block:: python
G
guosheng 已提交
3930

3931
            # x is a rank 2 tensor variable
S
SunGaofeng 已提交
3932
            import paddle.fluid as fluid
3933 3934
            x = fluid.data(name='data', shape=[300, 300], dtype='float32')
            out = fluid.layers.pad(x=x, paddings=[0, 1, 1, 2], pad_value=0.)
G
guosheng 已提交
3935
    """
3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949
    check_variable_and_dtype(
        x,
        'x',
        [
            'float16',
            'float32',
            'float64',
            'int32',
            'int64',
            'complex64',
            'complex128',
        ],
        "pad",
    )
3950

3951 3952 3953 3954
    check_type(pad_value, 'pad_value', (float, int, Variable), 'pad')
    if isinstance(pad_value, int):
        pad_value = float(pad_value)

3955 3956
    helper = LayerHelper('pad', **locals())
    dtype = helper.input_dtype(input_param_name='x')
X
Xin Pan 已提交
3957
    out = helper.create_variable_for_type_inference(dtype)
3958 3959 3960 3961 3962 3963
    helper.append_op(
        type='pad',
        inputs={'X': x},
        outputs={'Out': out},
        attrs={'paddings': paddings, 'pad_value': pad_value},
    )
G
guosheng 已提交
3964
    return out
3965 3966


3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977
def image_resize(
    input,
    out_shape=None,
    scale=None,
    name=None,
    resample='BILINEAR',
    actual_shape=None,
    align_corners=True,
    align_mode=1,
    data_format='NCHW',
):
3978
    """
3979

R
ruri 已提交
3980
    This op resizes a batch of images.
F
stash  
fengjiayi 已提交
3981

3982 3983
    The input must be a 3-D Tensor of the shape (num_batches, channels, in_w)
    or a 4-D Tensor of the shape (num_batches, channels, in_h, in_w)
3984 3985
    or (num_batches, in_h, in_w, channels), or a 5-D Tensor of the shape
    (num_batches, channels, in_d, in_h, in_w) or (num_batches, in_d, in_h, in_w, channels),
T
tianshuo78520a 已提交
3986
    and the resizing only applies on the three dimensions(depth, height and width).
3987

3988
    **Warning:** the parameter :attr:`actual_shape` will be deprecated in the
3989 3990
    future and only use :attr:`out_shape` instead.

3991
    Supporting resample methods:
3992
        'LINEAR' : Linear interpolation
Q
update  
qiaolongfei 已提交
3993

3994
        'BILINEAR' : Bilinear interpolation
T
Tink_Y 已提交
3995

K
Kaipeng Deng 已提交
3996 3997
        'TRILINEAR' : Trilinear interpolation

3998
        'NEAREST' : Nearest neighbor interpolation
3999

4000
        'BICUBIC' : Bicubic interpolation
4001 4002

    Linear interpolation is the method of using a line connecting two known quantities
4003
    to determine the value of an unknown quantity between the two known quantities.
4004

4005
    Nearest neighbor interpolation is to perform nearest neighbor interpolation
4006
    in both the 3rd dimension(in height direction) and the 4th dimension(in width
4007
    direction) on input tensor.
4008 4009 4010 4011 4012

    Bilinear interpolation is an extension of linear interpolation for
    interpolating functions of two variables (e.g. H-direction and
    W-direction in this op) on a rectilinear 2D grid. The key idea is
    to perform linear interpolation first in one direction, and then
4013 4014
    again in the other direction.

4015 4016 4017
    Trilinear interpolation is an extension of linear interpolation for
    interpolating functions of three variables (e.g. D-direction,
    H-direction and W-direction in this op) on a rectilinear 3D grid.
K
Kaipeng Deng 已提交
4018
    The linear interpolation is performed on three directions.
4019

4020 4021 4022 4023
    Bicubic interpolation is an extension of cubic interpolation for interpolating
    data points on a two-dimensional regular grid. The interpolated surface is
    smoother than corresponding surfaces obtained by bilinear interpolation or
    nearest-neighbor interpolation.
K
Kaipeng Deng 已提交
4024

4025
    Align_corners and align_mode are optional parameters,the calculation method
4026 4027 4028 4029
    of interpolation can be selected by them.

    Example:

T
Tink_Y 已提交
4030
    .. code-block:: text
4031

T
Tink_Y 已提交
4032
        For scale:
4033

T
Tink_Y 已提交
4034
            if align_corners = True && out_size > 1 :
4035

T
Tink_Y 已提交
4036
              scale_factor = (in_size-1.0)/(out_size-1.0)
4037

T
Tink_Y 已提交
4038
            else:
4039

T
Tink_Y 已提交
4040
              scale_factor = float(in_size/out_size)
4041 4042


T
Tink_Y 已提交
4043
        Nearest neighbor interpolation:
4044

T
Tink_Y 已提交
4045 4046
          if:
              align_corners = False
4047

T
Tink_Y 已提交
4048 4049
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4050

T
Tink_Y 已提交
4051 4052
              H_out = floor (H_{in} * scale_{factor})
              W_out = floor (W_{in} * scale_{factor})
4053

T
Tink_Y 已提交
4054 4055
          else:
              align_corners = True
4056

T
Tink_Y 已提交
4057 4058
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4059

T
Tink_Y 已提交
4060 4061
              H_out = round(H_{in} * scale_{factor})
              W_out = round(W_{in} * scale_{factor})
4062

4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079
        linear interpolation:

          if:
              align_corners = False , align_mode = 0

              input : (N,C,W_in)
              output: (N,C,W_out) where:

              W_out = (W_{in}+0.5) * scale_{factor} - 0.5

          else:

              input : (N,C,W_in)
              output: (N,C,H_out,W_out) where:

              W_out = W_{in} * scale_{factor}

T
Tink_Y 已提交
4080 4081 4082 4083
        Bilinear interpolation:

          if:
              align_corners = False , align_mode = 0
4084

T
Tink_Y 已提交
4085 4086
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4087

T
Tink_Y 已提交
4088 4089
              H_out = (H_{in}+0.5) * scale_{factor} - 0.5
              W_out = (W_{in}+0.5) * scale_{factor} - 0.5
4090

T
Tink_Y 已提交
4091
          else:
4092

T
Tink_Y 已提交
4093 4094
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4095

T
Tink_Y 已提交
4096 4097
              H_out = H_{in} * scale_{factor}
              W_out = W_{in} * scale_{factor}
4098

K
Kaipeng Deng 已提交
4099 4100 4101 4102
        Trilinear interpolation:

          if:
              align_corners = False , align_mode = 0
4103

K
Kaipeng Deng 已提交
4104 4105
              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:
4106

K
Kaipeng Deng 已提交
4107 4108 4109 4110 4111 4112
              D_out = (D_{in}+0.5) * scale_{factor} - 0.5
              H_out = (H_{in}+0.5) * scale_{factor} - 0.5
              W_out = (W_{in}+0.5) * scale_{factor} - 0.5


          else:
4113

K
Kaipeng Deng 已提交
4114 4115 4116 4117
              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:

              D_out = D_{in} * scale_{factor}
4118

4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130
        Trilinear interpolation:
          if:
              align_corners = False , align_mode = 0
              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:
              D_out = (D_{in}+0.5) * scale_{factor} - 0.5
              H_out = (H_{in}+0.5) * scale_{factor} - 0.5
              W_out = (W_{in}+0.5) * scale_{factor} - 0.5
          else:
              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:
              D_out = D_{in} * scale_{factor}
K
Kaipeng Deng 已提交
4131 4132
              H_out = H_{in} * scale_{factor}
              W_out = W_{in} * scale_{factor}
4133

4134

4135 4136
    For details of linear interpolation, please refer to Wikipedia:
    https://en.wikipedia.org/wiki/Linear_interpolation.
4137

4138
    For details of nearest neighbor interpolation, please refer to Wikipedia:
4139
    https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation.
4140

4141
    For details of bilinear interpolation, please refer to Wikipedia:
4142
    https://en.wikipedia.org/wiki/Bilinear_interpolation.
4143

4144
    For details of trilinear interpolation, please refer to Wikipedia:
K
Kaipeng Deng 已提交
4145
    https://en.wikipedia.org/wiki/Trilinear_interpolation.
4146

4147 4148
    For details of bicubic interpolation, please refer to Wikipedia:
    https://en.wikipedia.org/wiki/Bicubic_interpolation
4149

R
ruri 已提交
4150
    Parameters:
4151
        input (Variable): 3-D, 4-D or 5-D Tensor, its data type is float32, float64, or uint8,
4152
                          its data format is specified by :attr:`data_format`.
4153
        out_shape (list|tuple|Variable|None): Output shape of image resize
4154 4155
             layer, the shape is (out_w, ) when input is a 3-D Tensor, the shape is (out_h, out_w)
             when input is a 4-D Tensor and is (out_d, out_h, out_w) when input is a 5-D Tensor.
4156
             Default: None. If a list, each element can be an integer or a Tensor Variable of shape: [1].
4157
             If a Tensor Variable, its dimensions size should be a 1.
4158 4159 4160
        scale(float|Variable|None): The multiplier for the input height or width. At
             least one of :attr:`out_shape` or :attr:`scale` must be set.
             And :attr:`out_shape` has a higher priority than :attr:`scale`.
D
dengkaipeng 已提交
4161
             Default: None.
4162 4163
        name(str|None): A name for this layer(optional). If set None, the layer
                        will be named automatically.
4164
        resample(str): The resample method. It supports 'LINEAR', 'BICUBIC', 'BILINEAR', 'TRILINEAR'
K
Kaipeng Deng 已提交
4165
                       and 'NEAREST' currently. Default: 'BILINEAR'
4166 4167 4168
        actual_shape(Variable): An optional input to specify output shape
                                dynamically. If provided, image resize
                                according to this given shape rather than
4169
                                :attr:`out_shape` and :attr:`scale` specifying
4170 4171
                                shape. That is to say actual_shape has the
                                highest priority. It is recommended to use
4172 4173 4174 4175 4176
                                :attr:`out_shape` if you want to specify output
                                shape dynamically, because :attr:`actual_shape`
                                will be deprecated. When using actual_shape to
                                specify output shape, one of :attr:`out_shape`
                                and :attr:`scale` should also be set, otherwise
T
tianshuo78520a 已提交
4177
                                errors would be occurred in graph constructing stage.
4178
                                Default: None
4179 4180
        align_corners(bool) :  An optional bool, If True, the centers of the 4 corner pixels of the
                               input and output tensors are aligned, preserving the values at the
4181 4182
                               corner pixels.
                               Default: True
4183 4184
        align_mode(int)  :  An optional for linear/bilinear/trilinear interpolation. Refer to the fomula in the
                            the example code above, it can be \'0\' for src_idx = scale*(dst_indx+0.5)-0.5 ,
4185
                            can be \'1\' for src_idx = scale*dst_index.
4186
        data_format (str, optional): Specify the data format of the input, and the data format of the output
4187
            will be consistent with that of the input. An optional string from:`NCW`, `NWC`, `"NCHW"`, `"NHWC"`, `"NCDHW"`,
4188
            `"NDHWC"`. The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
4189
            `[batch_size, input_channels, input_height, input_width]`. When it is `"NCHW"`, the data is stored
4190
            in the order of: `[batch_size, input_channels, input_depth, input_height, input_width]`.
4191 4192

    Returns:
4193
        A 3-D Tensor of the shape (num_batches, channels, out_w) or (num_batches, out_w, channels),
4194 4195
        A 4-D Tensor of the shape (num_batches, channels, out_h, out_w) or (num_batches, out_h, out_w, channels),
        or 5-D Tensor of the shape (num_batches, channels, out_d, out_h, out_w) or (num_batches, out_d, out_h, out_w, channels).
F
stash  
fengjiayi 已提交
4196

4197 4198 4199
    Raises:
        TypeError: out_shape should be a list or tuple or Variable.
        TypeError: actual_shape should either be Variable or None.
4200 4201
        ValueError: The 'resample' of image_resize can only be 'LINEAR', 'BILINEAR',
                    'TRILINEAR', 'BICUBIC' or 'NEAREST' currently.
4202
        ValueError: 'LINEAR' only support 3-D tensor.
4203
        ValueError: 'BICUBIC', 'BILINEAR' and 'NEAREST' only support 4-D tensor.
K
Kaipeng Deng 已提交
4204
        ValueError: 'TRILINEAR' only support 5-D tensor.
4205
        ValueError: One of out_shape and scale must not be None.
4206
        ValueError: out_shape length should be 1 for input 3-D tensor.
K
Kaipeng Deng 已提交
4207 4208
        ValueError: out_shape length should be 2 for input 4-D tensor.
        ValueError: out_shape length should be 3 for input 5-D tensor.
D
dengkaipeng 已提交
4209
        ValueError: scale should be greater than zero.
T
tianshuo78520a 已提交
4210
        TypeError: align_corners should be a bool value
4211
        ValueError: align_mode can only be '0' or '1'
4212
        ValueError: data_format can only be 'NCW', 'NWC', 'NCHW', 'NHWC', 'NCDHW' or 'NDHWC'.
4213

4214 4215
    Examples:
        .. code-block:: python
4216

4217 4218 4219 4220 4221 4222
            #declarative mode
            import paddle
            import paddle.fluid as fluid
            import numpy as np
            paddle.enable_static()
            input = fluid.data(name="input", shape=[None,3,6,10])
R
ruri 已提交
4223

4224 4225
            #1
            output = fluid.layers.image_resize(input=input,out_shape=[12,12])
R
ruri 已提交
4226

4227 4228 4229 4230 4231
            #2
            #x = np.array([2]).astype("int32")
            #dim1 = fluid.data(name="dim1", shape=[1], dtype="int32")
            #fluid.layers.assign(input=x, output=dim1)
            #output = fluid.layers.image_resize(input=input,out_shape=[12,dim1])
R
ruri 已提交
4232

4233 4234 4235 4236 4237
            #3
            #x = np.array([3,12]).astype("int32")
            #shape_tensor = fluid.data(name="shape_tensor", shape=[2], dtype="int32")
            #fluid.layers.assign(input=x, output=shape_tensor)
            #output = fluid.layers.image_resize(input=input,out_shape=shape_tensor)
R
ruri 已提交
4238

4239 4240 4241 4242 4243
            #4
            #x = np.array([0.5]).astype("float32")
            #scale_tensor = fluid.data(name="scale", shape=[1], dtype="float32")
            #fluid.layers.assign(x,scale_tensor)
            #output = fluid.layers.image_resize(input=input,scale=scale_tensor)
R
ruri 已提交
4244

4245 4246 4247
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
4248

4249
            input_data = np.random.rand(2,3,6,10).astype("float32")
4250

4251
            output_data = exe.run(fluid.default_main_program(),
R
ruri 已提交
4252 4253 4254
                feed={"input":input_data},
                fetch_list=[output],
                return_numpy=True)
4255

4256
            print(output_data[0].shape)
4257

4258 4259 4260 4261 4262 4263 4264 4265
            #1
            # (2, 3, 12, 12)
            #2
            # (2, 3, 12, 2)
            #3
            # (2, 3, 3, 12)
            #4
            # (2, 3, 3, 5)
4266

4267 4268
            #imperative mode
            import paddle.fluid.dygraph as dg
4269

4270 4271 4272 4273
            with dg.guard(place) as g:
                input = dg.to_variable(input_data)
                output = fluid.layers.image_resize(input=input, out_shape=[12,12])
                print(output.shape)
4274

4275
                # [2L, 3L, 12L, 12L]
4276

4277
    """
4278
    resample_methods = {
4279
        'LINEAR': 'linear',
4280
        'BILINEAR': 'bilinear',
K
Kaipeng Deng 已提交
4281
        'TRILINEAR': 'trilinear',
4282
        'NEAREST': 'nearest',
4283
        'LINEAR': 'linear',
4284
    }
4285
    resample = resample.upper()
4286 4287
    if resample not in resample_methods:
        raise ValueError(
4288
            "The 'resample' of image_resize can only be 'LINEAR', 'BILINEAR', 'TRILINEAR' "
4289 4290
            "or 'NEAREST' currently."
        )
4291
    resample_type = resample_methods[resample]
4292

4293 4294 4295
    if resample == 'LINEAR' and len(input.shape) != 3:
        raise ValueError("'LINER only support 3-D tensor.")
    elif resample in ['BILINEAR', 'NEAREST'] and len(input.shape) != 4:
K
Kaipeng Deng 已提交
4296
        raise ValueError("'BILINEAR' and 'NEAREST' only support 4-D tensor.")
4297
    elif resample == 'TRILINEAR' and len(input.shape) != 5:
K
Kaipeng Deng 已提交
4298 4299
        raise ValueError("'TRILINEAR'only support 5-D tensor.")

4300 4301 4302 4303 4304
    if not isinstance(align_corners, bool):
        raise TypeError("Attr align_corners should be a bool value")
    if align_mode != 0 and align_mode != 1:
        raise ValueError("align_mode can only be 0 or 1")

4305
    if out_shape is None and scale is None:
4306
        raise ValueError("One of out_shape and scale must not be None.")
4307
    helper = LayerHelper('{}_interp'.format(resample_type), **locals())
4308
    dtype = helper.input_dtype()
4309

4310
    if len(input.shape) == 3 and data_format not in ['NCW', 'NWC']:
4311
        raise ValueError(
4312 4313 4314 4315
            "Got wrong value for param `data_format`: "
            + data_format
            + " received but only `NCW` or `NWC` supported for 3-D input."
        )
4316
    elif len(input.shape) == 4 and data_format not in ['NCHW', 'NHWC']:
4317
        raise ValueError(
4318 4319 4320 4321
            "Got wrong value for param `data_format`: "
            + data_format
            + " received but only `NCHW` or `NHWC` supported for 4-D input."
        )
4322 4323
    elif len(input.shape) == 5 and data_format not in ['NCDHW', 'NDHWC']:
        raise ValueError(
4324 4325 4326 4327
            "Got wrong value for param `data_format`: "
            + data_format
            + " received but only `NCDHW` or `NDHWC` supported for 5-D input."
        )
4328

4329
    def _is_list_or_turple_(data):
4330
        return isinstance(data, list) or isinstance(data, tuple)
4331

4332
    if data_format == 'NCHW' or data_format == 'NCDHW' or data_format == 'NCW':
4333
        data_layout = 'NCHW'
4334
    if data_format == 'NHWC' or data_format == 'NDHWC' or data_format == 'NWC':
4335 4336
        data_layout = 'NHWC'

4337
    inputs = {"X": input}
D
dengkaipeng 已提交
4338
    attrs = {
4339 4340 4341
        "out_d": -1,
        "out_h": -1,
        "out_w": -1,
D
dengkaipeng 已提交
4342 4343
        "interp_method": resample_type,
        "align_corners": align_corners,
4344
        "align_mode": align_mode,
4345
        "data_layout": data_layout,
D
dengkaipeng 已提交
4346 4347
    }

4348
    if out_shape is not None:
4349
        if isinstance(out_shape, Variable) and not _non_static_mode():
4350
            out_shape.stop_gradient = True
4351
            inputs['OutSize'] = out_shape
4352
        else:
4353 4354 4355 4356 4357 4358 4359 4360
            if _non_static_mode():
                if isinstance(out_shape, Variable):
                    out_shape = list(out_shape.numpy())
                else:
                    out_shape = list(out_shape)
                for i, dim in enumerate(out_shape):
                    if isinstance(dim, Variable):
                        out_shape[i] = dim.numpy()[0]
4361
            if not (_is_list_or_turple_(out_shape)):
D
dengkaipeng 已提交
4362
                raise TypeError(
4363 4364
                    "out_shape should be a list or tuple or Variable."
                )
4365 4366 4367 4368 4369 4370
            # Validate the shape
            contain_var = False
            for dim_idx, dim_size in enumerate(out_shape):
                if isinstance(dim_size, Variable):
                    contain_var = True
                    continue
4371 4372 4373
                assert (
                    dim_size > 0
                ), "Each dimension size given in out_shape must be greater than 0."
4374 4375 4376 4377 4378 4379 4380 4381 4382 4383

            if contain_var:
                new_size_tensor = []
                size_list = []
                for dim in out_shape:
                    if isinstance(dim, Variable):
                        dim.stop_gradient = True
                        new_size_tensor.append(dim)
                        size_list.append(-1)
                    else:
4384
                        assert isinstance(dim, int)
4385
                        temp_out = helper.create_variable_for_type_inference(
4386 4387 4388 4389 4390
                            'int32'
                        )
                        fill_constant(
                            [1], 'int32', dim, force_cpu=True, out=temp_out
                        )
4391 4392 4393 4394
                        new_size_tensor.append(temp_out)
                        size_list.append(dim)
                inputs['SizeTensor'] = new_size_tensor

4395 4396
            if len(input.shape) == 3:
                if len(out_shape) != 1:
4397 4398 4399
                    raise ValueError(
                        "out_shape length should be 1 for " "input 3-D tensor."
                    )
4400 4401 4402 4403 4404 4405
                if contain_var:
                    attrs['out_w'] = size_list[0]
                else:
                    out_shape = list(map(int, out_shape))
                    attrs['out_w'] = out_shape[0]
            elif len(input.shape) == 4:
K
Kaipeng Deng 已提交
4406
                if len(out_shape) != 2:
4407 4408 4409
                    raise ValueError(
                        "out_shape length should be 2 for " "input 4-D tensor."
                    )
4410 4411 4412 4413 4414 4415 4416
                if contain_var:
                    attrs['out_h'] = size_list[0]
                    attrs['out_w'] = size_list[1]
                else:
                    out_shape = list(map(int, out_shape))
                    attrs['out_h'] = out_shape[0]
                    attrs['out_w'] = out_shape[1]
K
Kaipeng Deng 已提交
4417 4418
            if len(input.shape) == 5:
                if len(out_shape) != 3:
4419 4420 4421
                    raise ValueError(
                        "out_shape length should be 3 for " "input 5-D tensor."
                    )
4422 4423 4424 4425 4426 4427 4428 4429 4430
                if contain_var:
                    attrs['out_d'] = size_list[0]
                    attrs['out_h'] = size_list[1]
                    attrs['out_w'] = size_list[2]
                else:
                    out_shape = list(map(int, out_shape))
                    attrs['out_d'] = out_shape[0]
                    attrs['out_h'] = out_shape[1]
                    attrs['out_w'] = out_shape[2]
4431

4432
    else:
4433 4434 4435
        if _non_static_mode() and isinstance(scale, Variable):
            scale = scale.numpy()
        elif isinstance(scale, Variable):
4436 4437
            scale.stop_gradient = True
            inputs["Scale"] = scale
4438
        elif isinstance(scale, float) or isinstance(scale, int):
4439
            if scale <= 0:
4440
                raise ValueError("Attr(scale) should be greater than zero.")
4441
            attrs['scale'] = float(scale)
4442 4443
        else:
            raise TypeError(
4444 4445
                "Attr(scale)'s type should be float, int or Variable."
            )
4446

4447
    if isinstance(actual_shape, Variable):
4448 4449 4450 4451 4452
        warnings.warn(
            "actual_shape will be deprecated, it is recommended to use "
            "out_shape instead of actual_shape to specify output shape dynamically."
        )
        actual_shape.stop_gradient = True
4453 4454 4455
        inputs["OutSize"] = actual_shape
    elif actual_shape is not None:
        raise TypeError("actual_shape should either be Variable or None.")
4456 4457 4458 4459 4460 4461 4462 4463 4464

    if _non_static_mode():
        attr_list = []
        for k, v in attrs.items():
            attr_list.append(k)
            attr_list.append(v)
        dy_attr = tuple(attr_list)

        if resample_type == "linear":
4465
            out = _legacy_C_ops.linear_interp(input, actual_shape, *dy_attr)
4466
        elif resample_type == "bilinear":
4467
            out = _legacy_C_ops.bilinear_interp(input, actual_shape, *dy_attr)
4468
        elif resample_type == "trilinear":
4469
            out = _legacy_C_ops.trilinear_interp(input, actual_shape, *dy_attr)
4470
        elif resample_type == "nearest":
4471
            out = _legacy_C_ops.nearest_interp(input, actual_shape, *dy_attr)
4472
        elif resample_type == "bicubic":
4473
            out = _legacy_C_ops.bicubic_interp(input, actual_shape, *dy_attr)
4474 4475
        return out

X
Xin Pan 已提交
4476
    out = helper.create_variable_for_type_inference(dtype)
4477 4478 4479 4480 4481 4482
    helper.append_op(
        type='{}_interp'.format(resample_type),
        inputs=inputs,
        outputs={"Out": out},
        attrs=attrs,
    )
4483
    return out
F
stash  
fengjiayi 已提交
4484 4485


4486
@templatedoc(op_type="bilinear_interp")
4487 4488 4489 4490 4491 4492 4493 4494 4495 4496
def resize_bilinear(
    input,
    out_shape=None,
    scale=None,
    name=None,
    actual_shape=None,
    align_corners=True,
    align_mode=1,
    data_format='NCHW',
):
4497
    """
4498

R
ruri 已提交
4499
    This op resizes the input by performing bilinear interpolation based on given
4500
    output shape which specified by actual_shape, out_shape and scale
4501 4502
    in priority order.

4503
    **Warning:** the parameter :attr:`actual_shape` will be deprecated in
4504 4505
    the future and only use :attr:`out_shape` instead.

4506 4507 4508 4509
    Bilinear interpolation is an extension of linear interpolation for
    interpolating functions of two variables (e.g. H-direction and
    W-direction in this op) on a rectilinear 2D grid. The key idea is
    to perform linear interpolation first in one direction, and then
4510 4511
    again in the other direction.

4512
    For details of bilinear interpolation, please refer to Wikipedia:
4513
    https://en.wikipedia.org/wiki/Bilinear_interpolation
Y
yuyang18 已提交
4514

4515
    Align_corners and align_mode are optional parameters,the calculation
4516 4517 4518 4519
    method of interpolation can be selected by them.

    Example:

T
Tink_Y 已提交
4520
    .. code-block:: text
4521

T
Tink_Y 已提交
4522
        For scale:
4523

T
Tink_Y 已提交
4524
            if align_corners = True && out_size > 1 :
4525

T
Tink_Y 已提交
4526
              scale_factor = (in_size-1.0)/(out_size-1.0)
4527

T
Tink_Y 已提交
4528
            else:
4529

4530
              scale_factor = float(in_size/out_size)
4531

T
Tink_Y 已提交
4532 4533 4534 4535
        Bilinear interpolation:

          if:
              align_corners = False , align_mode = 0
4536

T
Tink_Y 已提交
4537 4538
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4539

T
Tink_Y 已提交
4540 4541
              H_out = (H_{in}+0.5) * scale_{factor} - 0.5
              W_out = (W_{in}+0.5) * scale_{factor} - 0.5
4542

T
Tink_Y 已提交
4543
          else:
T
tink2123 已提交
4544

T
Tink_Y 已提交
4545 4546 4547 4548
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
              H_out = H_{in} * scale_{factor}
              W_out = W_{in} * scale_{factor}
4549

R
ruri 已提交
4550 4551
    Parameters:
        input(Variable): 4-D Tensor(NCHW), its data type is float32, float64, or uint8,
4552
                          its data format is specified by :attr:`data_format`.
D
dengkaipeng 已提交
4553
        out_shape(list|tuple|Variable|None): Output shape of resize bilinear
4554 4555
            layer, the shape is (out_h, out_w).Default: None. If a list, each
            element can be an integer or a Tensor Variable with shape: [1]. If a
4556
            Tensor Variable, its dimension size should be 1.
4557
        scale(float|Variable|None): The multiplier for the input height or width. At
4558 4559
             least one of :attr:`out_shape` or :attr:`scale` must be set.
             And :attr:`out_shape` has a higher priority than :attr:`scale`.
D
dengkaipeng 已提交
4560
             Default: None.
4561 4562 4563
        actual_shape(Variable): An optional input to specify output shape
                                dynamically. If provided, image resize
                                according to this given shape rather than
4564
                                :attr:`out_shape` and :attr:`scale` specifying
4565 4566
                                shape. That is to say actual_shape has the
                                highest priority. It is recommended to use
4567 4568 4569 4570 4571
                                :attr:`out_shape` if you want to specify output
                                shape dynamically, because :attr:`actual_shape`
                                will be deprecated. When using actual_shape to
                                specify output shape, one of :attr:`out_shape`
                                and :attr:`scale` should also be set, otherwise
T
tianshuo78520a 已提交
4572
                                errors would be occurred in graph constructing stage.
4573
                                Default: None
4574 4575
        align_corners(bool): ${align_corners_comment}
        align_mode(bool): ${align_mode_comment}
4576
        data_format (str, optional): Specify the data format of the input, and the data format of the output
4577 4578 4579
            will be consistent with that of the input. An optional string from: `"NCHW"`, `"NHWC"`.
            The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
            `[batch_size, input_channels, input_height, input_width]`.
R
ruri 已提交
4580
        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
yuyang18 已提交
4581 4582

    Returns:
4583
        Variable: 4-D tensor(NCHW or NHWC).
4584

4585 4586
    Examples:
        .. code-block:: python
4587

4588 4589 4590 4591 4592 4593
            #declarative mode
            import paddle.fluid as fluid
            import numpy as np
            import paddle
            paddle.enable_static()
            input = fluid.data(name="input", shape=[None,3,6,10])
R
ruri 已提交
4594

4595 4596
            #1
            output = fluid.layers.resize_bilinear(input=input,out_shape=[12,12])
R
ruri 已提交
4597

4598 4599 4600 4601 4602
            #2
            #x = np.array([2]).astype("int32")
            #dim1 = fluid.data(name="dim1", shape=[1], dtype="int32")
            #fluid.layers.assign(input=x, output=dim1)
            #output = fluid.layers.resize_bilinear(input=input,out_shape=[12,dim1])
R
ruri 已提交
4603

4604 4605 4606 4607 4608
            #3
            #x = np.array([3,12]).astype("int32")
            #shape_tensor = fluid.data(name="shape_tensor", shape=[2], dtype="int32")
            #fluid.layers.assign(input=x, output=shape_tensor)
            #output = fluid.layers.resize_bilinear(input=input,out_shape=shape_tensor)
R
ruri 已提交
4609

4610 4611 4612 4613 4614
            #4
            #x = np.array([0.5]).astype("float32")
            #scale_tensor = fluid.data(name="scale", shape=[1], dtype="float32")
            #fluid.layers.assign(x,scale_tensor)
            #output = fluid.layers.resize_bilinear(input=input,scale=scale_tensor)
R
ruri 已提交
4615

4616 4617 4618
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
4619

4620
            input_data = np.random.rand(2,3,6,10).astype("float32")
4621

4622
            output_data = exe.run(fluid.default_main_program(),
R
ruri 已提交
4623 4624 4625
                feed={"input":input_data},
                fetch_list=[output],
                return_numpy=True)
4626

4627
            print(output_data[0].shape)
4628

4629 4630 4631 4632 4633 4634 4635 4636
            #1
            # (2, 3, 12, 12)
            #2
            # (2, 3, 12, 2)
            #3
            # (2, 3, 3, 12)
            #4
            # (2, 3, 3, 5)
4637

4638 4639
            #imperative mode
            import paddle.fluid.dygraph as dg
4640

4641 4642 4643 4644
            with dg.guard(place) as g:
                input = dg.to_variable(input_data)
                output = fluid.layers.resize_bilinear(input=input, out_shape=[12,12])
                print(output.shape)
4645

4646
                # [2L, 3L, 12L, 12L]
4647

4648 4649
    """

4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660
    return image_resize(
        input,
        out_shape,
        scale,
        name,
        'BILINEAR',
        actual_shape,
        align_corners,
        align_mode,
        data_format,
    )
4661 4662


K
Kaipeng Deng 已提交
4663
@templatedoc(op_type="trilinear_interp")
4664 4665 4666 4667 4668 4669 4670 4671 4672 4673
def resize_trilinear(
    input,
    out_shape=None,
    scale=None,
    name=None,
    actual_shape=None,
    align_corners=True,
    align_mode=1,
    data_format='NCDHW',
):
K
Kaipeng Deng 已提交
4674
    """
4675

R
ruri 已提交
4676
    This op resizes the input by performing trilinear interpolation based on given
K
Kaipeng Deng 已提交
4677 4678 4679
    output shape which specified by actual_shape, out_shape and scale
    in priority order.

4680
    **Warning:** the parameter :attr:`actual_shape` will be deprecated
4681 4682
    in the future and only use :attr:`out_shape` instead.

4683 4684 4685
    Trilinear interpolation is an extension of linear interpolation for
    interpolating functions of three variables (e.g. D-direction,
    H-direction and W-direction in this op) on a rectilinear 3D grid.
K
Kaipeng Deng 已提交
4686 4687 4688 4689 4690
    The linear interpolation is performed on three directions.

    For details of trilinear interpolation, please refer to Wikipedia:
    https://en.wikipedia.org/wiki/Trilinear_interpolation

4691
    Align_corners and align_mode are optional parameters,the calculation
K
Kaipeng Deng 已提交
4692 4693 4694 4695 4696 4697 4698
    method of interpolation can be selected by them.

    Example:

    .. code-block:: text

        For scale:
4699

K
Kaipeng Deng 已提交
4700 4701 4702
            if align_corners = True && out_size > 1 :

              scale_factor = (in_size-1.0)/(out_size-1.0)
4703

K
Kaipeng Deng 已提交
4704
            else:
4705 4706

              scale_factor = float(in_size/out_size)
K
Kaipeng Deng 已提交
4707 4708 4709 4710

        Bilinear interpolation:

          if:
4711

K
Kaipeng Deng 已提交
4712
              align_corners = False , align_mode = 0
4713

K
Kaipeng Deng 已提交
4714 4715
              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:
4716

K
Kaipeng Deng 已提交
4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729
              D_out = (D_{in}+0.5) * scale_{factor} - 0.5
              H_out = (H_{in}+0.5) * scale_{factor} - 0.5
              W_out = (W_{in}+0.5) * scale_{factor} - 0.5

          else:

              input : (N,C,D_in,H_in,W_in)
              output: (N,C,D_out,H_out,W_out) where:

              D_out = D_{in} * scale_{factor}
              H_out = H_{in} * scale_{factor}
              W_out = W_{in} * scale_{factor}

R
ruri 已提交
4730
    Parameters:
4731 4732
        input(${x_type}): 5-D Tensor, its data type is float32, float64, or uint8,
                          its data format is specified by :attr:`data_format`.
R
ruri 已提交
4733
        out_shape(list|tuple|Variable|None): The output shape of resized tensor, the shape is (out_d, out_h, out_w). Default: None. Every element should be an integer or a Tensor Variable with shape: [1] if it is a list. If it is a Tensor Variable, its dimension size should be 1.
4734
        scale(float|Variable|None): The multiplier for the input depth, height or width.
4735 4736
             At least one of :attr:`out_shape` or :attr:`scale` must be set.
             And :attr:`out_shape` has a higher priority than :attr:`scale`.
K
Kaipeng Deng 已提交
4737
             Default: None.
R
ruri 已提交
4738
        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`
K
Kaipeng Deng 已提交
4739 4740 4741 4742 4743 4744
        actual_shape(Variable): An optional input to specify output shape
                                dynamically. If provided, image resize
                                according to this given shape rather than
                                :attr:`out_shape` and :attr:`scale` specifying
                                shape. That is to say actual_shape has the
                                highest priority. It is recommended to use
4745 4746 4747 4748 4749
                                :attr:`out_shape` if you want to specify output
                                shape dynamically, because :attr:`actual_shape`
                                will be deprecated. When using actual_shape to
                                specify output shape, one of :attr:`out_shape`
                                and :attr:`scale` should also be set, otherwise
T
tianshuo78520a 已提交
4750
                                errors would be occurred in graph constructing stage.
K
Kaipeng Deng 已提交
4751 4752 4753
                                Default: None
        align_corners(bool): ${align_corners_comment}
        align_mode(bool): ${align_mode_comment}
4754
        data_format (str, optional): Specify the data format of the input, and the data format of the output
4755 4756 4757
            will be consistent with that of the input. An optional string from: `"NCDHW"`, `"NDHWC"`.
            The default is `"NCDHW"`. When it is `"NCDHW"`, the data is stored in the order of:
            `[batch_size, input_channels, input_depth, input_height, input_width]`.
K
Kaipeng Deng 已提交
4758 4759

    Returns:
4760
        Variable: A 5-D Tensor(NCDHW or NDHWC)
K
Kaipeng Deng 已提交
4761 4762 4763

    Examples:
        .. code-block:: python
4764

4765 4766 4767 4768 4769 4770
            #declarative mode
            import paddle.fluid as fluid
            import paddle
            import numpy as np
            paddle.enable_static()
            input = fluid.data(name="input", shape=[None,3,6,8,10])
R
ruri 已提交
4771

4772 4773
            #1
            output = fluid.layers.resize_trilinear(input=input,out_shape=[12,12,12])
R
ruri 已提交
4774

4775 4776 4777 4778 4779
            #2
            #x = np.array([2]).astype("int32")
            #dim1 = fluid.data(name="dim1", shape=[1], dtype="int32")
            #fluid.layers.assign(input=x, output=dim1)
            #output = fluid.layers.resize_trilinear(input=input,out_shape=[12,dim1,4])
R
ruri 已提交
4780

4781 4782 4783 4784 4785
            #3
            #x = np.array([3,12,12]).astype("int32")
            #shape_tensor = fluid.data(name="shape_tensor", shape=[3], dtype="int32")
            #fluid.layers.assign(input=x, output=shape_tensor)
            #output = fluid.layers.resize_trilinear(input=input,out_shape=shape_tensor)
R
ruri 已提交
4786

4787 4788 4789 4790 4791
            #4
            #x = np.array([0.5]).astype("float32")
            #scale_tensor = fluid.data(name="scale", shape=[1], dtype="float32")
            #fluid.layers.assign(x,scale_tensor)
            #output = fluid.layers.resize_trilinear(input=input,scale=scale_tensor)
R
ruri 已提交
4792

4793 4794 4795
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
4796

4797
            input_data = np.random.rand(2,3,6,8,10).astype("float32")
K
Kaipeng Deng 已提交
4798

4799
            output_data = exe.run(fluid.default_main_program(),
R
ruri 已提交
4800 4801 4802
                feed={"input":input_data},
                fetch_list=[output],
                return_numpy=True)
4803

4804
            print(output_data[0].shape)
R
ruri 已提交
4805

4806 4807 4808 4809 4810 4811 4812 4813
            #1
            # (2, 3, 12, 12, 12)
            #2
            # (2, 3, 12, 2, 4)
            #3
            # (2, 3, 3, 12, 12)
            #4
            # (2, 3, 3, 4, 5)
R
ruri 已提交
4814

4815 4816
            #imperative mode
            import paddle.fluid.dygraph as dg
4817

4818 4819 4820 4821
            with dg.guard(place) as g:
                input = dg.to_variable(input_data)
                output = fluid.layers.resize_trilinear(input=input, out_shape=[12,12,12])
                print(output.shape)
4822

4823
                # [2L, 3L, 12L, 12L, 12L]
4824 4825 4826



K
Kaipeng Deng 已提交
4827 4828
    """

4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839
    return image_resize(
        input,
        out_shape,
        scale,
        name,
        'TRILINEAR',
        actual_shape,
        align_corners,
        align_mode,
        data_format,
    )
K
Kaipeng Deng 已提交
4840 4841


4842
@templatedoc(op_type="nearest_interp")
4843 4844 4845 4846 4847 4848 4849 4850 4851
def resize_nearest(
    input,
    out_shape=None,
    scale=None,
    name=None,
    actual_shape=None,
    align_corners=True,
    data_format='NCHW',
):
4852
    """
4853

R
ruri 已提交
4854
    This op resizes the input by performing nearest neighbor interpolation in both the
4855
    height direction and the width direction based on given output shape
4856
    which is specified by actual_shape, out_shape and scale in priority order.
4857

4858
    **Warning:** the parameter :attr:`actual_shape` will be deprecated in the
4859 4860
    future and only use :attr:`out_shape` instead.

4861 4862
    Example:

T
Tink_Y 已提交
4863 4864 4865
    .. code-block:: text

        For scale:
4866

T
Tink_Y 已提交
4867 4868
            if align_corners = True && out_size > 1 :
              scale_factor = (in_size-1.0)/(out_size-1.0)
4869

T
Tink_Y 已提交
4870
            else:
4871

T
Tink_Y 已提交
4872
              scale_factor = float(in_size/out_size)
4873

T
Tink_Y 已提交
4874
        Nearest neighbor interpolation:
4875

T
Tink_Y 已提交
4876 4877
          if:
              align_corners = False
4878

T
Tink_Y 已提交
4879 4880
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4881

T
Tink_Y 已提交
4882 4883
              H_out = floor(H_{in} * scale_{factor})
              W_out = floor(W_{in} * scale_{factor})
4884

T
Tink_Y 已提交
4885 4886
          else:
              align_corners = True
4887

T
Tink_Y 已提交
4888 4889
              input : (N,C,H_in,W_in)
              output: (N,C,H_out,W_out) where:
4890

T
Tink_Y 已提交
4891 4892
              H_out = round(H_{in} * scale_{factor})
              W_out = round(W_{in} * scale_{factor})
4893 4894


4895
    For details of nearest neighbor interpolation, please refer to Wikipedia:
4896
    https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation
Y
yuyang18 已提交
4897

R
ruri 已提交
4898
    Parameters:
4899 4900
        input(${x_type}): 4-D Tensor, its data type is float32, float64, or uint8,
                          its data format is specified by :attr:`data_format`.
R
ruri 已提交
4901
        out_shape(list|tuple|Variable|None): The output shape of resized tensor, the shape is (out_h, out_w). Default: None. Every element should be an integer or a tensor Variable with shape: [1] if it is a list. If it is a tensor Variable, its dimension size should be 1.
4902
        scale(float|Variable|None): The multiplier for the input height or width. At
4903 4904 4905
             least one of :attr:`out_shape` or :attr:`scale` must be set.
             And :attr:`out_shape` has a higher priority than :attr:`scale`.
             Default: None.
R
ruri 已提交
4906
        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`
4907
        actual_shape(Variable): An optional input to specify output shape
4908 4909
                                dynamically. If provided, image resize
                                according to this given shape rather than
4910
                                :attr:`out_shape` and :attr:`scale` specifying
4911 4912
                                shape. That is to say actual_shape has the
                                highest priority. It is recommended to use
4913 4914 4915 4916 4917
                                :attr:`out_shape` if you want to specify output
                                shape dynamically, because :attr:`actual_shape`
                                will be deprecated. When using actual_shape to
                                specify output shape, one of :attr:`out_shape`
                                and :attr:`scale` should also be set, otherwise
T
tianshuo78520a 已提交
4918
                                errors would be occurred in graph constructing stage.
4919
                                Default: None
4920
        align_corners(bool): ${align_corners_comment}
4921
        data_format (str, optional): Specify the data format of the input, and the data format of the output
4922 4923 4924
            will be consistent with that of the input. An optional string from: `"NCHW"`, `"NHWC"`.
            The default is `"NCHW"`. When it is `"NCHW"`, the data is stored in the order of:
            `[batch_size, input_channels, input_height, input_width]`.
Y
yuyang18 已提交
4925 4926

    Returns:
4927
        Variable: 4-D tensor(NCHW or NHWC).
4928 4929 4930

    Examples:
        .. code-block:: python
4931

4932 4933 4934 4935 4936
            #declarative mode
            import paddle.fluid as fluid
            import numpy as np
            import paddle
            paddle.enable_static()
4937

4938
            input = fluid.data(name="input", shape=[None,3,6,10])
R
ruri 已提交
4939

4940 4941
            #1
            output = fluid.layers.resize_nearest(input=input,out_shape=[12,12])
R
ruri 已提交
4942

4943 4944 4945 4946 4947
            #2
            #x = np.array([2]).astype("int32")
            #dim1 = fluid.data(name="dim1", shape=[1], dtype="int32")
            #fluid.layers.assign(input=x, output=dim1)
            #output = fluid.layers.resize_nearest(input=input,out_shape=[12,dim1])
R
ruri 已提交
4948

4949 4950 4951 4952 4953
            #3
            #x = np.array([3,12]).astype("int32")
            #shape_tensor = fluid.data(name="shape_tensor", shape=[2], dtype="int32")
            #fluid.layers.assign(input=x, output=shape_tensor)
            #output = fluid.layers.resize_nearest(input=input,out_shape=shape_tensor)
R
ruri 已提交
4954

4955 4956 4957 4958 4959
            #4
            #x = np.array([0.5]).astype("float32")
            #scale_tensor = fluid.data(name="scale", shape=[1], dtype="float32")
            #fluid.layers.assign(x,scale_tensor)
            #output = fluid.layers.resize_nearest(input=input,scale=scale_tensor)
R
ruri 已提交
4960

4961 4962 4963
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
4964

4965
            input_data = np.random.rand(2,3,6,10).astype("float32")
4966

4967
            output_data = exe.run(fluid.default_main_program(),
R
ruri 已提交
4968 4969 4970
                feed={"input":input_data},
                fetch_list=[output],
                return_numpy=True)
4971

4972
            print(output_data[0].shape)
R
ruri 已提交
4973

4974 4975 4976 4977 4978 4979 4980 4981
            #1
            # (2, 3, 12, 12)
            #2
            # (2, 3, 12, 2)
            #3
            # (2, 3, 3, 12)
            #4
            # (2, 3, 3, 5)
4982

4983 4984
            #imperative mode
            import paddle.fluid.dygraph as dg
4985

4986 4987 4988 4989
            with dg.guard(place) as g:
                input = dg.to_variable(input_data)
                output = fluid.layers.resize_nearest(input=input, out_shape=[12,12])
                print(output.shape)
R
ruri 已提交
4990

4991
                # [2L, 3L, 12L, 12L]
4992 4993 4994



4995 4996
    """

4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007
    return image_resize(
        input,
        out_shape,
        scale,
        name,
        'NEAREST',
        actual_shape,
        align_corners,
        align_mode=1,
        data_format=data_format,
    )
5008 5009


5010
@deprecated(since="2.0.0", update_to="paddle.nn.functional.relu")
5011
def relu(x, name=None):
W
wanghaoshuang 已提交
5012
    """
Z
zhupengyang 已提交
5013
    ${comment}
W
wanghaoshuang 已提交
5014 5015

    Args:
Z
zhupengyang 已提交
5016 5017 5018 5019
        x(Variable): ${x_comment}
        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`.
W
wanghaoshuang 已提交
5020 5021

    Returns:
Z
zhupengyang 已提交
5022
        Variable: ${out_comment}
W
wanghaoshuang 已提交
5023 5024 5025 5026 5027

    Examples:

        .. code-block:: python

5028
            import paddle.fluid as fluid
Z
zhupengyang 已提交
5029 5030 5031 5032 5033 5034 5035
            import numpy as np
            in1 = np.array([[-1,0],[1,2.6]])
            with fluid.dygraph.guard():
                x1 = fluid.dygraph.to_variable(in1)
                out1 = fluid.layers.relu(x1)
                print(out1.numpy())
                # [[0.  0. ]
5036
                #  [1.  2.6]]"""
5037 5038

    if in_dygraph_mode():
W
wanghuancoder 已提交
5039
        return _C_ops.relu(x)
5040 5041
    if _in_legacy_dygraph():
        return _legacy_C_ops.relu(x)
5042

5043 5044
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'], 'relu')

5045
    inputs = {'X': [x]}
W
wanghaoshuang 已提交
5046
    helper = LayerHelper('relu', **locals())
W
wanghaoshuang 已提交
5047
    dtype = helper.input_dtype(input_param_name='x')
X
Xin Pan 已提交
5048
    out = helper.create_variable_for_type_inference(dtype)
5049 5050 5051
    helper.append_op(
        type="relu", inputs={"X": helper.input('x')}, outputs={"Out": out}
    )
W
wanghaoshuang 已提交
5052
    return out
5053 5054


G
fix  
gongweibao 已提交
5055 5056 5057
from paddle.fluid.framework import convert_np_dtype_to_dtype_


5058
@deprecated(since="2.0.0", update_to="paddle.normal")
G
gongweibao 已提交
5059
@templatedoc()
5060 5061 5062
def gaussian_random(
    shape, mean=0.0, std=1.0, seed=0, dtype='float32', name=None
):
G
fix  
gongweibao 已提交
5063
    """
5064 5065
    This OP returns a Tensor filled with random values sampled from a Gaussian
    distribution, with ``shape`` and ``dtype``.
G
fix  
gongweibao 已提交
5066 5067

    Args:
5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082
        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).
        mean(float|int, 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): ${seed_comment}
        dtype(str|np.dtype|core.VarDesc.VarType, optional): The data type of
            the output Tensor. Supported data types: 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`.
G
fix  
gongweibao 已提交
5083 5084

    Returns:
5085 5086
        Tensor: A Tensor filled with random values sampled from a Gaussian
        distribution, with ``shape`` and ``dtype``.
G
fix  
gongweibao 已提交
5087

5088
    Examples:
5089
       .. code-block:: python
5090

5091
            import paddle
5092
            import paddle.fluid as fluid
5093
            paddle.enable_static()
5094 5095

            # example 1:
5096
            # attr shape is a list which doesn't contain Tensor.
5097
            result_1 = fluid.layers.gaussian_random(shape=[3, 4])
5098 5099 5100
            # [[-0.31261674,  1.8736548,  -0.6274357,   0.96988016],
            #  [-0.12294637,  0.9554768,   1.5690808,  -1.2894802 ],
            #  [-0.60082096, -0.61138713,  1.5345167,  -0.21834975]]
5101 5102

            # example 2:
5103 5104 5105
            # attr shape is a list which contains Tensor.
            dim_1 = fluid.layers.fill_constant([1], "int64", 2)
            dim_2 = fluid.layers.fill_constant([1], "int32", 3)
5106
            result_2 = fluid.layers.gaussian_random(shape=[dim_1, dim_2])
5107 5108
            # [[ 0.51398206, -0.3389769,   0.23597084],
            #  [ 1.0388143,  -1.2015356,  -1.0499583 ]]
5109 5110

            # example 3:
5111
            # attr shape is a Tensor, the data type must be int64 or int32.
5112 5113
            var_shape = fluid.data(name='var_shape', shape=[2], dtype="int64")
            result_3 = fluid.layers.gaussian_random(var_shape)
5114 5115 5116 5117
            # if var_shape's value is [2, 3]
            # result_3 is:
            # [[-0.12310527,  0.8187662,   1.923219  ]
            #  [ 0.70721835,  0.5210541,  -0.03214082]]
5118

5119
       .. code-block:: python
5120

5121 5122
           # declarative mode
           # required: skiptest
5123 5124
           import numpy as np
           from paddle import fluid
5125

5126
           x = fluid.layers.gaussian_random((2, 3), std=2., seed=10)
5127

5128 5129 5130 5131
           place = fluid.CPUPlace()
           exe = fluid.Executor(place)
           start = fluid.default_startup_program()
           main = fluid.default_main_program()
5132

5133 5134
           exe.run(start)
           x_np, = exe.run(main, feed={}, fetch_list=[x])
5135

5136 5137 5138 5139 5140 5141 5142 5143 5144 5145
           x_np
           # array([[2.3060477, 2.676496 , 3.9911983],
           #        [0.9990833, 2.8675377, 2.2279181]], dtype=float32)

       .. code-block:: python

           # imperative mode
           import numpy as np
           from paddle import fluid
           import paddle.fluid.dygraph as dg
5146

5147 5148 5149
           place = fluid.CPUPlace()
           with dg.guard(place) as g:
               x = fluid.layers.gaussian_random((2, 4), mean=2., dtype="float32", seed=10)
5150
               x_np = x.numpy()
5151 5152 5153
           x_np
           # array([[2.3060477 , 2.676496  , 3.9911983 , 0.9990833 ],
           #        [2.8675377 , 2.2279181 , 0.79029655, 2.8447366 ]], dtype=float32)
G
fix  
gongweibao 已提交
5154
    """
5155 5156
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
5157

5158 5159 5160
    if in_dygraph_mode():
        shape = utils.convert_shape_to_list(shape)
        place = _current_expected_place()
5161
        return _C_ops.gaussian(
5162 5163
            shape, float(mean), float(std), seed, dtype, place
        )
5164 5165

    if _in_legacy_dygraph():
5166
        shape = utils.convert_shape_to_list(shape)
5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178
        return _legacy_C_ops.gaussian_random(
            'shape',
            shape,
            'mean',
            float(mean),
            'std',
            float(std),
            'seed',
            seed,
            'dtype',
            dtype,
        )
5179 5180 5181

    check_type(shape, 'shape', (list, tuple, Variable), 'gaussian_random/randn')
    check_dtype(dtype, 'dtype', ['float32', 'float64'], 'gaussian_random/randn')
5182 5183

    inputs = {}
5184 5185 5186 5187
    attrs = {
        'mean': mean,
        'std': std,
        'seed': seed,
5188
        'dtype': dtype,
5189
        'use_mkldnn': False,
5190
    }
5191 5192 5193
    utils.get_shape_tensor_inputs(
        inputs=inputs, attrs=attrs, shape=shape, op_type='gaussian_random/randn'
    )
5194

5195 5196
    helper = LayerHelper('gaussian_random', **locals())
    out = helper.create_variable_for_type_inference(dtype)
5197 5198 5199
    helper.append_op(
        type='gaussian_random', inputs=inputs, outputs={'Out': out}, attrs=attrs
    )
G
fix  
gongweibao 已提交
5200 5201 5202 5203

    return out


G
gongweibao 已提交
5204
@templatedoc()
G
fix  
gongweibao 已提交
5205
def sampling_id(x, min=0.0, max=1.0, seed=0, dtype='float32'):
G
fix  
gongweibao 已提交
5206
    """
R
ruri 已提交
5207
    This op is used for sampling id from multinomial distribution from the input, sampling one id for one sample.
G
fix  
gongweibao 已提交
5208

R
ruri 已提交
5209 5210 5211 5212
    Parameters:
        x (Variable): 2-D tensor, [batch_size, input_feature_dimensions]
        min (Float): minimum , default 0.0.
        max (Float): maximum, default 1.0.
5213
        seed (Float): Random seed, default 0. if seed is not 0, will generate same number every time.
G
fix  
gongweibao 已提交
5214
        dtype(np.dtype|core.VarDesc.VarType|str): The type of output data : float32, float_16, int etc
G
fix  
gongweibao 已提交
5215 5216

    Returns:
R
ruri 已提交
5217
        Variable: sampling tensor.
G
fix  
gongweibao 已提交
5218

5219 5220 5221
    Examples:
        .. code-block:: python

5222
            import paddle.fluid as fluid
R
ruri 已提交
5223
            x = fluid.data(
5224 5225
                name="X",
                shape=[13, 11],
R
ruri 已提交
5226
                dtype='float32')
5227

Y
Yibing Liu 已提交
5228
            out = fluid.layers.sampling_id(x)
G
fix  
gongweibao 已提交
5229 5230 5231
    """

    helper = LayerHelper('sampling_id', **locals())
X
Xin Pan 已提交
5232
    out = helper.create_variable_for_type_inference(dtype)
5233 5234 5235 5236 5237 5238
    helper.append_op(
        type='sampling_id',
        inputs={'X': x},
        outputs={'Out': out},
        attrs={'min': min, 'max': max, 'seed': seed},
    )
G
fix  
gongweibao 已提交
5239 5240 5241 5242 5243 5244

    return out


def shape(input):
    """
5245
    :alias_main: paddle.shape
5246 5247
        :alias: paddle.shape,paddle.tensor.shape,paddle.tensor.attribute.shape
        :old_api: paddle.fluid.layers.shape
5248

C
chengduozh 已提交
5249 5250
    **Shape Layer**

C
fix doc  
chengduozh 已提交
5251
    Get the shape of the input.
G
fix  
gongweibao 已提交
5252

5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269
    .. code-block:: text

        Case1:
            Given N-D Tensor:
                input = [ [1, 2, 3, 4], [5, 6, 7, 8] ]

            Then:
                input.shape = [2, 4]

        Case2:
            Given SelectedRows:
                input.rows = [0, 4, 19]
                input.height = 20
                input.value = [ [1, 2], [3, 4], [5, 6] ]  # inner tensor
            Then:
                input.shape = [3, 2]

G
fix  
gongweibao 已提交
5270
    Args:
5271
        input (Variable): The input can be N-D Tensor or SelectedRows with data type bool, float16, float32, float64, int32, int64.
5272
                          If input variable is type of SelectedRows, returns the shape of it's inner tensor.
G
fix  
gongweibao 已提交
5273 5274

    Returns:
5275
        Variable (Tensor): The shape of the input variable.
G
fix  
gongweibao 已提交
5276

5277 5278 5279
    Examples:
        .. code-block:: python

5280
            import paddle.fluid as fluid
5281
            import numpy as np
W
Wilber 已提交
5282 5283
            import paddle
            paddle.enable_static()
5284

5285
            inputs = fluid.data(name="x", shape=[3, 100, 100], dtype="float32")
5286 5287 5288 5289 5290 5291 5292 5293 5294
            output = fluid.layers.shape(inputs)

            exe = fluid.Executor(fluid.CPUPlace())
            exe.run(fluid.default_startup_program())

            img = np.ones((3, 100, 100)).astype(np.float32)

            res = exe.run(fluid.default_main_program(), feed={'x':img}, fetch_list=[output])
            print(res) # [array([  3, 100, 100], dtype=int32)]
G
fix  
gongweibao 已提交
5295
    """
5296
    if in_dygraph_mode():
5297
        out = _C_ops.shape(input)
5298 5299 5300
        out.stop_gradient = True
        return out
    if _in_legacy_dygraph():
5301
        out = _legacy_C_ops.shape(input)
W
Wilber 已提交
5302 5303 5304
        out.stop_gradient = True
        return out

5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319
    check_variable_and_dtype(
        input,
        'input',
        [
            'bool',
            'float16',
            'float32',
            'float64',
            'int32',
            'int64',
            'complex64',
            'complex128',
        ],
        'shape',
    )
G
fix  
gongweibao 已提交
5320
    helper = LayerHelper('shape', **locals())
5321
    out = helper.create_variable_for_type_inference(dtype='int32')
5322 5323 5324 5325 5326 5327
    helper.append_op(
        type='shape',
        inputs={'Input': input},
        outputs={'Out': out},
        stop_gradient=True,
    )
G
fix  
gongweibao 已提交
5328 5329

    return out
G
merge  
gongweibao 已提交
5330 5331


S
sneaxiy 已提交
5332 5333 5334 5335
def _elementwise_op(helper):
    op_type = helper.layer_type
    x = helper.kwargs.get('x', None)
    y = helper.kwargs.get('y', None)
X
Xin Pan 已提交
5336

S
sneaxiy 已提交
5337 5338
    assert x is not None, 'x cannot be None in {}'.format(op_type)
    assert y is not None, 'y cannot be None in {}'.format(op_type)
5339
    check_variable_and_dtype(
5340 5341 5342 5343 5344
        x,
        'x',
        ['float16', 'uint16', 'float32', 'float64', 'int32', 'int64'],
        op_type,
    )
5345
    check_variable_and_dtype(
5346 5347 5348 5349 5350
        y,
        'y',
        ['float16', 'uint16', 'float32', 'float64', 'int32', 'int64'],
        op_type,
    )
5351

S
sneaxiy 已提交
5352 5353
    axis = helper.kwargs.get('axis', -1)
    use_mkldnn = helper.kwargs.get('use_mkldnn', False)
S
sneaxiy 已提交
5354
    name = helper.kwargs.get('name', None)
5355
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
S
sneaxiy 已提交
5356

5357 5358 5359 5360 5361 5362
    helper.append_op(
        type=op_type,
        inputs={'X': x, 'Y': y},
        outputs={'Out': out},
        attrs={'axis': axis, 'use_mkldnn': use_mkldnn},
    )
S
sneaxiy 已提交
5363 5364 5365
    return helper.append_activation(out)


X
Xin Pan 已提交
5366
def elementwise_add(x, y, axis=-1, act=None, name=None):
5367
    """
5368

5369
    Examples:
5370

5371
        .. code-block:: python
5372

5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385
            import paddle.fluid as fluid
            import numpy as np
            import paddle
            def gen_data():
                return {
                    "x": np.array([2, 3, 4]).astype('float32'),
                    "y": np.array([1, 5, 2]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[3], dtype='float32')
            y = fluid.data(name="y", shape=[3], dtype='float32')
            z = fluid.layers.elementwise_add(x, y)
            # z = x + y
5386

5387 5388 5389 5390
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5391

5392
            print(z_value) # [3., 8., 6.]
5393 5394


5395
        .. code-block:: python
5396

5397 5398 5399
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5400

5401 5402 5403 5404 5405 5406 5407 5408 5409 5410
            def gen_data():
                return {
                    "x": np.ones((2, 3, 4, 5)).astype('float32'),
                    "y": np.zeros((3, 4)).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[3,4], dtype='float32')
            z = fluid.layers.elementwise_add(x, y, axis=1)
            # z = x + y
5411

5412 5413
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5414

5415 5416
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5417

5418
            print(z_value) # z.shape=[2,3,4,5]
5419 5420


5421
        ..  code-block:: python
5422

5423 5424 5425
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5426

5427 5428 5429 5430 5431 5432 5433 5434 5435 5436
            def gen_data():
                return {
                    "x": np.random.randint(1, 5, size=[2, 3, 4, 5]).astype('float32'),
                    "y": np.random.randint(1, 5, size=[5]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[5], dtype='float32')
            z = fluid.layers.elementwise_add(x, y, axis=3)
            # z = x + y
5437

5438 5439
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5440

5441 5442 5443
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
            print(z_value) # z.shape=[2,3,4,5]
5444 5445

    """
J
Jiabin Yang 已提交
5446
    if _non_static_mode():
5447
        return _elementwise_op_in_dygraph(
5448 5449 5450 5451 5452
            x,
            y,
            axis=axis,
            act=act,
            op_name='elementwise_add',
5453 5454
            use_mkldnn=_global_flags()["FLAGS_use_mkldnn"],
        )
5455

S
sneaxiy 已提交
5456 5457 5458
    return _elementwise_op(LayerHelper('elementwise_add', **locals()))


5459
@deprecated(since="2.0.0", update_to="paddle.divide")
X
Xin Pan 已提交
5460
def elementwise_div(x, y, axis=-1, act=None, name=None):
5461
    """
5462

5463
    Examples:
5464

5465
        .. code-block:: python
5466

5467 5468 5469
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5470

5471 5472 5473 5474 5475 5476 5477 5478 5479 5480
            def gen_data():
                return {
                    "x": np.array([2, 3, 4]).astype('float32'),
                    "y": np.array([1, 5, 2]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[3], dtype='float32')
            y = fluid.data(name="y", shape=[3], dtype='float32')
            z = fluid.layers.elementwise_div(x, y)
            # z = x / y
5481

5482 5483 5484 5485
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5486

5487
            print(z_value) # [2., 0.6, 2.]
5488 5489


5490
        .. code-block:: python
5491

5492 5493 5494
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5495

5496 5497 5498 5499 5500 5501 5502 5503 5504 5505
            def gen_data():
                return {
                    "x": np.ones((2, 3, 4, 5)).astype('float32'),
                    "y": np.zeros((3, 4)).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[3,4], dtype='float32')
            z = fluid.layers.elementwise_div(x, y, axis=1)
            # z = x / y
5506

5507 5508
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5509

5510 5511
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5512

5513
            print(z_value) # z.shape=[2,3,4,5]
5514 5515


5516
        ..  code-block:: python
5517

5518 5519 5520
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5521

5522 5523 5524 5525 5526 5527 5528 5529 5530 5531
            def gen_data():
                return {
                    "x": np.random.randint(1, 5, size=[2, 3, 4, 5]).astype('float32'),
                    "y": np.random.randint(1, 5, size=[5]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[5], dtype='float32')
            z = fluid.layers.elementwise_div(x, y, axis=3)
            # z = x / y
5532

5533 5534
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5535

5536 5537 5538
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
            print(z_value) # z.shape=[2,3,4,5]
5539 5540

    """
J
Jiabin Yang 已提交
5541
    if _non_static_mode():
5542 5543 5544
        return _elementwise_op_in_dygraph(
            x, y, axis=axis, act=act, op_name='elementwise_div'
        )
5545

S
sneaxiy 已提交
5546 5547 5548
    return _elementwise_op(LayerHelper('elementwise_div', **locals()))


X
Xin Pan 已提交
5549
def elementwise_sub(x, y, axis=-1, act=None, name=None):
5550
    """
5551

5552
    Examples:
5553

5554
        .. code-block:: python
5555

5556 5557 5558
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5559

5560 5561 5562 5563 5564 5565 5566 5567 5568 5569
            def gen_data():
                return {
                    "x": np.array([2, 3, 4]).astype('float32'),
                    "y": np.array([1, 5, 2]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[3], dtype='float32')
            y = fluid.data(name="y", shape=[3], dtype='float32')
            z = fluid.layers.elementwise_sub(x, y)
            # z = x - y
5570

5571 5572 5573 5574
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5575

5576
            print(z_value) # [1., -2., 2.]
5577 5578


5579
        .. code-block:: python
5580

5581 5582 5583
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5584

5585 5586 5587 5588 5589 5590 5591 5592 5593 5594
            def gen_data():
                return {
                    "x": np.ones((2, 3, 4, 5)).astype('float32'),
                    "y": np.zeros((3, 4)).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[3,4], dtype='float32')
            z = fluid.layers.elementwise_sub(x, y, axis=1)
            # z = x - y
5595

5596 5597
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5598

5599 5600
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5601

5602
            print(z_value) # z.shape=[2,3,4,5]
5603 5604


5605
        ..  code-block:: python
5606

5607 5608 5609
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5610

5611 5612 5613 5614 5615 5616 5617 5618 5619 5620
            def gen_data():
                return {
                    "x": np.random.randint(1, 5, size=[2, 3, 4, 5]).astype('float32'),
                    "y": np.random.randint(1, 5, size=[5]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[5], dtype='float32')
            z = fluid.layers.elementwise_sub(x, y, axis=3)
            # z = x - y
5621

5622 5623
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5624

5625 5626 5627
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
            print(z_value) # z.shape=[2,3,4,5]
5628 5629

    """
J
Jiabin Yang 已提交
5630
    if _non_static_mode():
5631 5632 5633
        return _elementwise_op_in_dygraph(
            x, y, axis=axis, act=act, op_name='elementwise_sub'
        )
5634

S
sneaxiy 已提交
5635 5636 5637
    return _elementwise_op(LayerHelper('elementwise_sub', **locals()))


5638
@deprecated(since="2.0.0", update_to="paddle.multiply")
X
Xin Pan 已提交
5639
def elementwise_mul(x, y, axis=-1, act=None, name=None):
5640
    """
5641

5642
    Examples:
5643

5644
        .. code-block:: python
5645

5646 5647 5648
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5649

5650 5651 5652 5653 5654 5655 5656 5657 5658 5659
            def gen_data():
                return {
                    "x": np.array([2, 3, 4]).astype('float32'),
                    "y": np.array([1, 5, 2]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[3], dtype='float32')
            y = fluid.data(name="y", shape=[3], dtype='float32')
            z = fluid.layers.elementwise_mul(x, y)
            # z = x * y
5660

5661 5662 5663 5664
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5665

5666
            print(z_value) # [2., 15., 8.]
5667 5668


5669
        .. code-block:: python
5670

5671 5672 5673
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5674

5675 5676 5677 5678 5679 5680 5681 5682 5683 5684
            def gen_data():
                return {
                    "x": np.ones((2, 3, 4, 5)).astype('float32'),
                    "y": np.zeros((3, 4)).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[3,4], dtype='float32')
            z = fluid.layers.elementwise_mul(x, y, axis=1)
            # z = x * y
5685

5686 5687
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5688

5689 5690
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
5691

5692
            print(z_value) # z.shape=[2,3,4,5]
5693 5694


5695
        ..  code-block:: python
5696

5697 5698 5699
            import paddle.fluid as fluid
            import numpy as np
            import paddle
5700

5701 5702 5703 5704 5705 5706 5707 5708 5709 5710
            def gen_data():
                return {
                    "x": np.random.randint(1, 5, size=[2, 3, 4, 5]).astype('float32'),
                    "y": np.random.randint(1, 5, size=[5]).astype('float32')
                }
            paddle.enable_static()
            x = fluid.data(name="x", shape=[2,3,4,5], dtype='float32')
            y = fluid.data(name="y", shape=[5], dtype='float32')
            z = fluid.layers.elementwise_mul(x, y, axis=3)
            # z = x * y
5711

5712 5713
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
5714

5715 5716 5717
            z_value = exe.run(feed=gen_data(),
                                fetch_list=[z.name])
            print(z_value) # z.shape=[2,3,4,5]
5718

5719
    """
J
Jiabin Yang 已提交
5720
    if _non_static_mode():
5721 5722 5723
        return _elementwise_op_in_dygraph(
            x, y, axis=axis, act=act, op_name='elementwise_mul'
        )
5724

S
sneaxiy 已提交
5725 5726 5727 5728
    return _elementwise_op(LayerHelper('elementwise_mul', **locals()))


for func in [
5729 5730 5731 5732
    elementwise_add,
    elementwise_div,
    elementwise_sub,
    elementwise_mul,
5733 5734
]:
    op_proto = OpProtoHolder.instance().get_op_proto(func.__name__)
5735 5736

    # insert the c++ doc string on top of python doc string
5737 5738 5739 5740 5741
    func.__doc__ = (
        _generate_doc_string_(
            op_proto,
            additional_args_lines=[
                "axis (int32, optional): If X.dimension != Y.dimension, \
5742 5743
            Y.dimension must be a subsequence of x.dimension. \
            And axis is the start dimension index for broadcasting Y onto X. ",
5744
                "act (string, optional): Activation applied to the output. \
5745
            Default is None. Details: :ref:`api_guide_activations_en` ",
5746
                "name (string, optional): Name of the output. \
5747
            Default is None. It's used to print debug info for developers. Details: \
5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763
            :ref:`api_guide_Name` ",
            ],
            skip_attrs_set={
                "x_data_format",
                "y_data_format",
                "axis",
                "use_quantizer",
                "mkldnn_data_type",
                "Scale_x",
                "Scale_y",
                "Scale_out",
            },
        )
        + """\n"""
        + str(func.__doc__)
    )
5764

5765 5766 5767
    doc_list = func.__doc__.splitlines()

    for idx, val in enumerate(doc_list):
5768 5769 5770 5771 5772
        if (
            val.startswith("Warning: ")
            and val.endswith(" instead.")
            and "and will be removed in future versions." in val
        ):
5773 5774 5775 5776
            doc_list.insert(0, doc_list.pop(idx))
            func.__doc__ = "\n" + "\n".join(i for i in doc_list)
            break

5777
for func in []:
S
sneaxiy 已提交
5778 5779 5780 5781
    op_proto = OpProtoHolder.instance().get_op_proto(func.__name__)
    func.__doc__ = _generate_doc_string_(
        op_proto,
        additional_args_lines=[
S
sneaxiy 已提交
5782
            "act (basestring|None): Activation applied to the output.",
5783 5784 5785 5786 5787 5788
            "name (basestring|None): Name of the output.",
        ],
    )
    func.__doc__ = (
        func.__doc__
        + """
5789 5790 5791

Examples:
  .. code-block:: python
5792

5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822
    import paddle.fluid as fluid
    # example 1: shape(x) = (2, 3, 4, 5), shape(y) = (2, 3, 4, 5)
    x0 = fluid.layers.data(name="x0", shape=[2, 3, 4, 5], dtype='float32')
    y0 = fluid.layers.data(name="y0", shape=[2, 3, 4, 5], dtype='float32')
    z0 = fluid.layers.%s(x0, y0)

    # example 2: shape(X) = (2, 3, 4, 5), shape(Y) = (5)
    x1 = fluid.layers.data(name="x1", shape=[2, 3, 4, 5], dtype='float32')
    y1 = fluid.layers.data(name="y1", shape=[5], dtype='float32')
    z1 = fluid.layers.%s(x1, y1)

    # example 3: shape(X) = (2, 3, 4, 5), shape(Y) = (4, 5), with axis=-1(default) or axis=2
    x2 = fluid.layers.data(name="x2", shape=[2, 3, 4, 5], dtype='float32')
    y2 = fluid.layers.data(name="y2", shape=[4, 5], dtype='float32')
    z2 = fluid.layers.%s(x2, y2, axis=2)

    # example 4: shape(X) = (2, 3, 4, 5), shape(Y) = (3, 4), with axis=1
    x3 = fluid.layers.data(name="x3", shape=[2, 3, 4, 5], dtype='float32')
    y3 = fluid.layers.data(name="y3", shape=[3, 4], dtype='float32')
    z3 = fluid.layers.%s(x3, y3, axis=1)

    # example 5: shape(X) = (2, 3, 4, 5), shape(Y) = (2), with axis=0
    x4 = fluid.layers.data(name="x4", shape=[2, 3, 4, 5], dtype='float32')
    y4 = fluid.layers.data(name="y4", shape=[2], dtype='float32')
    z4 = fluid.layers.%s(x4, y4, axis=0)

    # example 6: shape(X) = (2, 3, 4, 5), shape(Y) = (2, 1), with axis=0
    x5 = fluid.layers.data(name="x5", shape=[2, 3, 4, 5], dtype='float32')
    y5 = fluid.layers.data(name="y5", shape=[2], dtype='float32')
    z5 = fluid.layers.%s(x5, y5, axis=0)
5823 5824 5825 5826 5827 5828 5829 5830 5831 5832
    """
        % (
            func.__name__,
            func.__name__,
            func.__name__,
            func.__name__,
            func.__name__,
            func.__name__,
        )
    )
M
minqiyang 已提交
5833 5834


5835
def _logical_op(op_name, x, y, out=None, name=None, binary_op=True):
J
Jiabin Yang 已提交
5836
    if _non_static_mode():
5837
        op = getattr(_legacy_C_ops, op_name)
5838 5839 5840 5841
        if binary_op:
            return op(x, y)
        else:
            return op(x)
5842
    check_variable_and_dtype(
5843 5844
        x,
        "x",
5845
        ["bool", "int8", "int16", "int32", "int64", "float32", "float64"],
5846 5847
        op_name,
    )
5848
    if y is not None:
5849
        check_variable_and_dtype(
5850 5851
            y,
            "y",
5852
            ["bool", "int8", "int16", "int32", "int64", "float32", "float64"],
5853 5854
            op_name,
        )
5855
    if out is not None:
5856
        check_type(out, "out", Variable, op_name)
5857

M
minqiyang 已提交
5858 5859
    helper = LayerHelper(op_name, **locals())

5860 5861 5862
    if binary_op and x.dtype != y.dtype:
        raise ValueError(
            "(InvalidArgument) The DataType of %s Op's Variable must be consistent, but received %s and %s."
5863 5864
            % (op_name, x.dtype, y.dtype)
        )
M
minqiyang 已提交
5865 5866

    if out is None:
5867
        out = helper.create_variable_for_type_inference(dtype=x.dtype)
M
minqiyang 已提交
5868 5869

    if binary_op:
5870 5871 5872
        helper.append_op(
            type=op_name, inputs={"X": x, "Y": y}, outputs={"Out": out}
        )
M
minqiyang 已提交
5873 5874 5875 5876 5877 5878
    else:
        helper.append_op(type=op_name, inputs={"X": x}, outputs={"Out": out})

    return out


5879 5880 5881
@templatedoc()
def clip(x, min, max, name=None):
    """
5882
        :old_api: paddle.fluid.layers.clip
5883

5884 5885 5886 5887
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
S
SunGaofeng 已提交
5888 5889
        min(float): ${min_comment}
        max(float): ${max_comment}
5890 5891
        name(str, optional): The default value is None.
                             Normally there is no need for user to set this property.
S
SunGaofeng 已提交
5892
                             For more information, please refer to :ref:`api_guide_Name`
5893 5894

    Returns:
S
SunGaofeng 已提交
5895 5896 5897 5898
        ${out_comment}

    Return Type:
        ${out_type}
5899 5900 5901 5902

    Examples:
        .. code-block:: python

S
SunGaofeng 已提交
5903
            import paddle.fluid as fluid
S
SunGaofeng 已提交
5904
            input = fluid.data(
5905 5906
                name='data', shape=[1], dtype='float32')
            reward = fluid.layers.clip(x=input, min=-1.0, max=1.0)
5907 5908 5909
    """

    helper = LayerHelper("clip", **locals())
5910
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'], 'clip')
5911 5912

    if name is None:
5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926
        name = unique_name.generate_with_ignorable_key(
            ".".join([helper.name, 'tmp'])
        )

    out = helper.create_variable(
        type=x.type, name=name, dtype=x.dtype, persistable=False
    )

    helper.append_op(
        type="clip",
        inputs={"X": x},
        attrs={"min": min, "max": max},
        outputs={"Out": out},
    )
5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938

    return out


@templatedoc()
def clip_by_norm(x, max_norm, name=None):
    """
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
        max_norm(${max_norm_type}): ${max_norm_comment}
5939 5940 5941
        name(str, optional): For detailed information, please refer
            to :ref:`api_guide_Name`. Usually name is no need to set and
            None by default.
5942 5943

    Returns:
5944
        Tensor:
W
wangguanzhong 已提交
5945

5946
        out(${out_type}): ${out_comment}
5947

W
wangguanzhong 已提交
5948

5949 5950 5951
    Examples:
        .. code-block:: python

5952
            import paddle
5953
            import paddle.fluid as fluid
5954

5955 5956 5957
            input = paddle.to_tensor([[2.0, 2.0], [2.0, 2.0]], dtype='float32')
            reward = fluid.layers.clip_by_norm(x=input, max_norm=1.0)
            # [[0.5, 0.5], [0.5, 0.5]]
5958 5959
    """

L
lyq 已提交
5960
    if in_dygraph_mode():
5961
        return _C_ops.clip_by_norm(x, max_norm)
J
Jiabin Yang 已提交
5962
    if _non_static_mode():
5963
        return _legacy_C_ops.clip_by_norm(x, 'max_norm', max_norm)
5964

5965
    helper = LayerHelper("clip_by_norm", **locals())
5966
    check_variable_and_dtype(x, 'X', ['float32', 'float16'], 'clip_by_norm')
5967
    check_type(max_norm, 'max_norm', (float), 'clip_by_norm')
5968 5969

    if name is None:
5970 5971 5972
        name = unique_name.generate_with_ignorable_key(
            ".".join([helper.name, 'tmp'])
        )
S
sneaxiy 已提交
5973

5974 5975 5976
    out = helper.create_variable(
        type=x.type, name=name, dtype=x.dtype, persistable=False
    )
5977

5978 5979 5980 5981 5982 5983
    helper.append_op(
        type="clip_by_norm",
        inputs={"X": x},
        attrs={"max_norm": max_norm},
        outputs={"Out": out},
    )
5984 5985

    return out
X
Xin Pan 已提交
5986 5987


5988
@deprecated(since="2.0.0", update_to="paddle.mean")
X
Xin Pan 已提交
5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999
@templatedoc()
def mean(x, name=None):
    """
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
        name(basestring|None): Name of the output.

    Returns:
        out(${out_type}): ${out_comment}
6000 6001 6002 6003

    Examples:
        .. code-block:: python

6004
            import paddle
6005
            import paddle.fluid as fluid
6006 6007
            paddle.enable_static()

6008 6009
            input = fluid.layers.data(
                name='data', shape=[2, 3], dtype='float32')
6010
            mean = paddle.mean(input)
X
Xin Pan 已提交
6011
    """
6012

6013
    if _in_legacy_dygraph():
6014
        return _legacy_C_ops.mean(x)
6015
    if in_dygraph_mode():
6016
        return _C_ops.mean_all(x)
X
Xin Pan 已提交
6017 6018

    helper = LayerHelper("mean", **locals())
6019
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'], 'mean')
6020
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
X
Xin Pan 已提交
6021

6022 6023 6024
    helper.append_op(
        type="mean", inputs={"X": x}, attrs={}, outputs={"Out": out}
    )
X
Xin Pan 已提交
6025 6026 6027 6028

    return out


C
chengduo 已提交
6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039
@templatedoc()
def merge_selected_rows(x, name=None):
    """
    ${comment}

    Args:
        x(${x_type}): ${x_comment}
        name(basestring|None): Name of the output.

    Returns:
        out(${out_type}): ${out_comment}
6040 6041 6042 6043

    Examples:
        .. code-block:: python

6044
            import paddle.fluid as fluid
6045 6046 6047 6048 6049
            b = fluid.default_main_program().global_block()
            var = b.create_var(
                name="X", dtype="float32", persistable=True,
                type=fluid.core.VarDesc.VarType.SELECTED_ROWS)
            y = fluid.layers.merge_selected_rows(var)
C
chengduo 已提交
6050
    """
6051 6052 6053
    if in_dygraph_mode():
        return _C_ops.merge_selected_rows(x)

6054
    if _non_static_mode():
6055
        return _legacy_C_ops.merge_selected_rows(x)
C
chengduo 已提交
6056 6057 6058

    helper = LayerHelper("merge_selected_rows", **locals())
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
6059 6060 6061 6062 6063 6064
    helper.append_op(
        type="merge_selected_rows",
        inputs={"X": x},
        attrs={},
        outputs={"Out": out},
    )
C
chengduo 已提交
6065 6066 6067
    return out


X
Xin Pan 已提交
6068 6069
def mul(x, y, x_num_col_dims=1, y_num_col_dims=1, name=None):
    """
L
liu zhengxi 已提交
6070 6071 6072 6073 6074 6075 6076 6077
    Mul Operator.
    This operator is used to perform matrix multiplication for input $x$ and $y$.
    The equation is:

    ..  math::
        Out = x * y

    Both the input $x$ and $y$ can carry the LoD (Level of Details) information, or not. But the output only shares the LoD information with input $x$.
X
Xin Pan 已提交
6078 6079

    Args:
L
liu zhengxi 已提交
6080 6081
        x (Variable): The first input Tensor/LoDTensor of mul_op.
        y (Variable): The second input Tensor/LoDTensor of mul_op.
6082 6083 6084
        x_num_col_dims (int, optional): The mul_op can take tensors with more than two dimensions as its inputs. If the input $x$ is a tensor with more than two dimensions, $x$ will be flattened into a two-dimensional matrix first. The flattening rule is: the first `num_col_dims` will be flattened to form the first dimension of the final matrix (the height of the matrix), and the rest `rank(x) - num_col_dims` dimensions are flattened to form the second dimension of the final matrix (the width of the matrix). As a result, height of the flattened matrix is equal to the product of $x$'s first `x_num_col_dims` dimensions' sizes, and width of the flattened matrix is equal to the product of $x$'s last `rank(x) - num_col_dims` dimensions' size. For example, suppose $x$ is a 6-dimensional tensor with the shape [2, 3, 4, 5, 6], and `x_num_col_dims` = 3. Thus, the flattened matrix will have a shape [2 x 3 x 4, 5 x 6] = [24, 30]. Default is 1.
        y_num_col_dims (int, optional): The mul_op can take tensors with more than two dimensions as its inputs. If the input $y$ is a tensor with more than two dimensions, $y$ will be flattened into a two-dimensional matrix first. The attribute `y_num_col_dims` determines how $y$ is flattened. See comments of `x_num_col_dims` for more details. Default is 1.
        name (str, optional): Name of the output. Normally there is no need for user to set this property. For more information, please refer to :ref:`api_guide_Name`. Default is None.
X
Xin Pan 已提交
6085 6086

    Returns:
L
liu zhengxi 已提交
6087
        Variable(Tensor/LoDTensor): The output Tensor/LoDTensor of mul op.
6088 6089

    Examples:
L
liu zhengxi 已提交
6090
        ..  code-block:: python
6091

6092
            import paddle.fluid as fluid
6093 6094
            import paddle
            paddle.enable_static()
6095 6096 6097 6098 6099
            dataX = fluid.layers.data(name="dataX", append_batch_size = False, shape=[2, 5], dtype="float32")
            dataY = fluid.layers.data(name="dataY", append_batch_size = False, shape=[5, 3], dtype="float32")
            output = fluid.layers.mul(dataX, dataY,
                                      x_num_col_dims = 1,
                                      y_num_col_dims = 1)
6100

6101

X
Xin Pan 已提交
6102
    """
J
Jiabin Yang 已提交
6103
    if _non_static_mode():
6104 6105 6106 6107 6108 6109 6110 6111
        return _legacy_C_ops.mul(
            x,
            y,
            'x_num_col_dims',
            x_num_col_dims,
            'y_num_col_dims',
            y_num_col_dims,
        )
X
Xin Pan 已提交
6112

6113 6114
    inputs = {"X": [x], "Y": [y]}
    attrs = {"x_num_col_dims": x_num_col_dims, "y_num_col_dims": y_num_col_dims}
X
Xin Pan 已提交
6115
    helper = LayerHelper("mul", **locals())
6116 6117
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'], 'mul')
    check_variable_and_dtype(y, 'y', ['float16', 'float32', 'float64'], 'mul')
6118
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
X
Xin Pan 已提交
6119

6120 6121 6122
    helper.append_op(
        type="mul", inputs={"X": x, "Y": y}, attrs=attrs, outputs={"Out": out}
    )
X
Xin Pan 已提交
6123 6124 6125
    return out


M
minqiyang 已提交
6126 6127
def hash(input, hash_size, num_hash=1, name=None):
    """
6128

Z
zhupengyang 已提交
6129
    This OP hash the input to an integer less than the hash_size.
M
minqiyang 已提交
6130 6131
    The hash algorithm we used was xxHash - Extremely fast hash algorithm
    (https://github.com/Cyan4973/xxHash/tree/v0.6.5)
M
minqiyang 已提交
6132 6133

    Args:
Z
zhupengyang 已提交
6134 6135 6136 6137 6138 6139
        input(Variable): A **Two-Dimensional** LoDTensor with type int32, int64.
             **Only support LoDTensor**.
        num_hash(int, optional): The times of hash, default is 1.
        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`.
M
minqiyang 已提交
6140 6141

    Returns:
Z
zhupengyang 已提交
6142
       Variable: A LoDTensor with the same data type as input.
M
minqiyang 已提交
6143 6144

    Examples:
Z
zhupengyang 已提交
6145
        .. code-block:: python
H
haowang101779990 已提交
6146

6147
            import paddle.fluid as fluid
Z
zhupengyang 已提交
6148
            import numpy as np
6149 6150
            import paddle
            paddle.enable_static()
6151

Z
zhupengyang 已提交
6152
            place = fluid.core.CPUPlace()
6153

6154 6155
            x = fluid.data(name="x", shape=[2,2], dtype="int32", lod_level=1)
            res = fluid.layers.hash(name="res", input=x, hash_size=1000, num_hash=4)
6156

Z
zhupengyang 已提交
6157 6158 6159 6160
            exe = fluid.Executor(place)
            exe.run(fluid.default_startup_program())
            in1 = np.array([[1,2],[3,4]]).astype("int32")
            print(in1)
6161
            x_i = fluid.create_lod_tensor(in1, [[0, 2]], place)
Z
zhupengyang 已提交
6162 6163 6164 6165 6166 6167 6168 6169 6170 6171
            res = exe.run(fluid.default_main_program(), feed={'x':x_i}, fetch_list=[res], return_numpy=False)
            print(np.array(res[0]))
            # [[[722]
            #   [407]
            #   [337]
            #   [395]]
            #  [[603]
            #   [590]
            #   [386]
            #   [901]]]
M
minqiyang 已提交
6172
    """
6173
    check_variable_and_dtype(input, 'input', ['int32', 'int64'], 'hash')
6174 6175
    check_type(hash_size, 'hash_size', int, 'hash')
    check_type(num_hash, 'num_hash', int, 'hash')
M
minqiyang 已提交
6176
    helper = LayerHelper('hash', **locals())
6177 6178 6179 6180 6181 6182 6183 6184 6185
    out = helper.create_variable_for_type_inference(
        helper.input_dtype(), stop_gradient=True
    )
    helper.append_op(
        type='hash',
        inputs={'X': input},
        outputs={'Out': out},
        attrs={'num_hash': num_hash, 'mod_by': hash_size},
    )
M
minqiyang 已提交
6186
    return out
G
gmcather 已提交
6187 6188


D
dengkaipeng 已提交
6189
@templatedoc()
6190 6191
def grid_sampler(x, grid, name=None):
    """
6192

6193
    This operation samples input X by using bilinear interpolation based on
T
tianshuo78520a 已提交
6194
    flow field grid, which is usually generated by :code:`affine_grid` . The grid of
K
Kaipeng Deng 已提交
6195 6196
    shape [N, H, W, 2] is the concatenation of (x, y) coordinates
    with shape [N, H, W] each, where x is indexing the 4th dimension
T
tianshuo78520a 已提交
6197 6198
    (in width dimension) of input data x and y is indexing the 3rd
    dimension (in height dimension), finally results is the bilinear
6199
    interpolation value of 4 nearest corner points. The output tensor
K
Kaipeng Deng 已提交
6200
    shape will be [N, C, H, W].
6201

H
haowang101779990 已提交
6202
    .. code-block:: text
6203

H
haowang101779990 已提交
6204 6205
        Step 1:
        Get (x, y) grid coordinates and scale to [0, H-1/W-1].
6206

K
Kaipeng Deng 已提交
6207 6208 6209 6210
        .. code-block:: text

            grid_x = 0.5 * (grid[:, :, :, 0] + 1) * (W - 1)
            grid_y = 0.5 * (grid[:, :, :, 1] + 1) * (H - 1)
6211

H
haowang101779990 已提交
6212 6213 6214
        Step 2:
        Indices input data X with grid (x, y) in each [H, W] area, and bilinear
        interpolate point value by 4 nearest points.
6215

H
haowang101779990 已提交
6216 6217 6218 6219 6220 6221 6222 6223 6224
          wn ------- y_n ------- en
          |           |           |
          |          d_n          |
          |           |           |
         x_w --d_w-- grid--d_e-- x_e
          |           |           |
          |          d_s          |
          |           |           |
          ws ------- y_s ------- wn
6225

H
haowang101779990 已提交
6226 6227 6228 6229
        x_w = floor(x)              // west side x coord
        x_e = x_w + 1               // east side x coord
        y_n = floor(y)              // north side y coord
        y_s = y_s + 1               // south side y coord
6230

H
haowang101779990 已提交
6231 6232 6233 6234
        d_w = grid_x - x_w          // distance to west side
        d_e = x_e - grid_x          // distance to east side
        d_n = grid_y - y_n          // distance to north side
        d_s = y_s - grid_y          // distance to south side
6235

H
haowang101779990 已提交
6236 6237 6238 6239
        wn = X[:, :, y_n, x_w]      // north-west point value
        en = X[:, :, y_n, x_e]      // north-east point value
        ws = X[:, :, y_s, x_w]      // south-east point value
        es = X[:, :, y_s, x_w]      // north-east point value
6240

H
haowang101779990 已提交
6241 6242
        output = wn * d_e * d_s + en * d_w * d_s
               + ws * d_e * d_n + es * d_w * d_n
D
dengkaipeng 已提交
6243 6244

    Args:
K
Kaipeng Deng 已提交
6245 6246 6247 6248 6249 6250 6251 6252 6253
        x(Variable): The input tensor, which is a 4-D tensor with shape
                     [N, C, H, W], N is the batch size, C is the channel
                     number, H and W is the feature height and width.
                     The data type is float32 or float64.
        grid(Variable): Input grid tensor of shape [N, H, W, 2]. The
                        data type is float32 or float64.
        name(str, optional): For detailed information, please refer
                             to :ref:`api_guide_Name`. Usually name is no need to set and
                             None by default.
D
dengkaipeng 已提交
6254 6255

    Returns:
H
haowang101779990 已提交
6256
        Variable: Output of shape [N, C, H, W] data samples input X
K
Kaipeng Deng 已提交
6257 6258
                  using bilnear interpolation based on input grid.
                  The data type is same as input tensor.
6259

H
haowang101779990 已提交
6260 6261 6262 6263
    Examples:

        .. code-block:: python

K
Kaipeng Deng 已提交
6264
            import paddle.fluid as fluid
6265 6266
            import paddle.fluid as fluid
            import paddle
K
Kaipeng Deng 已提交
6267

6268
            paddle.enable_static()
K
Kaipeng Deng 已提交
6269 6270
            # use with affine_grid
            x = fluid.data(name='x', shape=[None, 10, 32, 32], dtype='float32')
K
Kaipeng Deng 已提交
6271 6272
            theta = fluid.layers.data(name='theta', shape=[2, 3], dtype='float32')
            grid = fluid.layers.affine_grid(theta=theta, out_shape=[3, 10, 32, 32])
H
haowang101779990 已提交
6273
            out = fluid.layers.grid_sampler(x=x, grid=grid)
6274

D
dengkaipeng 已提交
6275 6276 6277
    """
    helper = LayerHelper("grid_sampler", **locals())

6278
    check_variable_and_dtype(x, 'x', ['float32', 'float64'], 'grid_sampler')
6279 6280 6281
    check_variable_and_dtype(
        grid, 'grid', ['float32', 'float64'], 'grid_sampler'
    )
D
dengkaipeng 已提交
6282 6283 6284 6285 6286 6287
    if not isinstance(x, Variable):
        return ValueError("The x should be a Variable")

    if not isinstance(grid, Variable):
        return ValueError("The grid should be a Variable")

6288
    out = helper.create_variable_for_type_inference(x.dtype)
D
dengkaipeng 已提交
6289 6290
    ipts = {'X': x, 'Grid': grid}

6291 6292
    attrs = {'use_cudnn': False} if core.is_compiled_with_rocm() else {}

6293 6294 6295
    helper.append_op(
        type='grid_sampler', inputs=ipts, outputs={'Output': out}, attrs=attrs
    )
6296 6297 6298
    return out


G
gmcather 已提交
6299
def log_loss(input, label, epsilon=1e-4, name=None):
6300
    r"""
6301

G
gmcather 已提交
6302 6303 6304 6305 6306 6307 6308
    **Negative Log Loss Layer**

    This layer accepts input predictions and target label and returns the
    negative log loss.

    .. math::

6309 6310
        Out = -label * \log{(input + \epsilon)}
              - (1 - label) * \log{(1 - input + \epsilon)}
G
gmcather 已提交
6311 6312

    Args:
6313
        input (Tensor|list):  A 2-D tensor with shape [N x 1], where N is the
G
gmcather 已提交
6314
                                batch size. This input is a probability computed
Y
Yibing Liu 已提交
6315
                                by the previous operator. Data type float32.
6316
        label (Tensor|list):  The ground truth which is a 2-D tensor with
6317
                                shape [N x 1], where N is the batch size.
Y
Yibing Liu 已提交
6318 6319
                                Data type float32.
        epsilon (float, optional): A small number for numerical stability. Default 1e-4.
6320
        name(str|None): For detailed information, please refer to
Y
Yibing Liu 已提交
6321
            :ref:`api_guide_Name` . Usually name is no need to set and None by default.
G
gmcather 已提交
6322 6323

    Returns:
6324
        Tensor, which shape is [N x 1], data type is float32.
G
gmcather 已提交
6325 6326 6327 6328

    Examples:
        .. code-block:: python

6329 6330 6331 6332 6333 6334
          import paddle
          import paddle.nn.functional as F

          label = paddle.randn((10,1))
          prob = paddle.randn((10,1))
          cost = F.log_loss(input=prob, label=label)
G
gmcather 已提交
6335
    """
6336
    return paddle.nn.functional.log_loss(input, label, epsilon, name)
G
gmcather 已提交
6337 6338


6339 6340 6341
def bilinear_tensor_product(
    x, y, size, act=None, name=None, param_attr=None, bias_attr=None
):
6342
    r"""
6343 6344
    :api_attr: Static Graph

Y
Yibing Liu 已提交
6345
    **Bilinear Tensor Product Layer**
Q
Qiao Longfei 已提交
6346

Q
Qiao Longfei 已提交
6347
    This layer performs bilinear tensor product on two inputs.
Q
Qiao Longfei 已提交
6348 6349 6350
    For example:

    .. math::
H
haowang101779990 已提交
6351
       out_{i} = x * W_{i} * {y^\mathrm{T}}, i=0,1,...,size-1
Q
Qiao Longfei 已提交
6352

Q
Qiao Longfei 已提交
6353
    In this formula:
6354 6355
      - :math:`x`: the first input contains M elements, shape is [batch_size, M].
      - :math:`y`: the second input contains N elements, shape is [batch_size, N].
Y
Yibing Liu 已提交
6356
      - :math:`W_{i}`: the i-th learned weight, shape is [M, N].
H
haowang101779990 已提交
6357
      - :math:`out_{i}`: the i-th element of out, shape is [batch_size, size].
Q
Qiao Longfei 已提交
6358 6359 6360
      - :math:`y^\mathrm{T}`: the transpose of :math:`y_{2}`.

    Args:
6361
        x (Variable): 2-D input tensor with shape [batch_size, M]. Data type
Y
Yibing Liu 已提交
6362
            is float32 or float64.
6363
        y (Variable): 2-D input tensor with shape [batch_size, N]. Data type
Y
Yibing Liu 已提交
6364
            should be same as **x**.
Q
Qiao Longfei 已提交
6365
        size (int): The dimension of this layer.
Y
Yibing Liu 已提交
6366
        act (str|None): Activation to be applied to the output of this layer. Default None.
6367
        name(str|None): For detailed information, please refer to
Y
Yibing Liu 已提交
6368
            :ref:`api_guide_Name` . Usually name is no need to set and None by default.
6369 6370
        param_attr (ParamAttr|None): To specify the weight parameter attribute.
            Default: None, which means the default weight parameter property is
Y
Yibing Liu 已提交
6371
            used. See usage for details in :ref:`api_fluid_ParamAttr` .
6372 6373
        bias_attr (ParamAttr|None): To specify the bias parameter attribute.
            Default: None, which means the default bias parameter property is
Y
Yibing Liu 已提交
6374
            used. See usage for details in :ref:`api_fluid_ParamAttr` .
Q
Qiao Longfei 已提交
6375
    Returns:
Y
Yibing Liu 已提交
6376
        Variable: A 2-D Tensor of shape [batch_size, size]. Data type is the same as input **x**.
Q
Qiao Longfei 已提交
6377 6378 6379 6380

    Examples:
        .. code-block:: python

6381 6382 6383 6384 6385
            import paddle
            paddle.enable_static()
            layer1 = paddle.static.data("t1", shape=[-1, 5], dtype="float32")
            layer2 = paddle.static.data("t2", shape=[-1, 4], dtype="float32")
            tensor = paddle.static.nn.bilinear_tensor_product(x=layer1, y=layer2, size=1000)
Q
Qiao Longfei 已提交
6386 6387
    """
    helper = LayerHelper('bilinear_tensor_product', **locals())
Q
Qiao Longfei 已提交
6388
    dtype = helper.input_dtype('x')
Q
Qiao Longfei 已提交
6389 6390 6391

    param_shape = [size, x.shape[1], y.shape[1]]

6392 6393 6394
    w = helper.create_parameter(
        attr=helper.param_attr, shape=param_shape, dtype=dtype, is_bias=False
    )
6395
    out = helper.create_variable_for_type_inference(dtype=dtype)
Q
Qiao Longfei 已提交
6396 6397 6398 6399

    inputs = {"X": x, "Y": y, "Weight": w}
    if helper.bias_attr:
        bias_size = [1, size]
6400 6401 6402
        bias = helper.create_parameter(
            attr=helper.bias_attr, shape=bias_size, dtype=dtype, is_bias=True
        )
Q
Qiao Longfei 已提交
6403
        inputs["Bias"] = bias
6404 6405 6406
    helper.append_op(
        type="bilinear_tensor_product", inputs=inputs, outputs={"Out": out}
    )
Q
Qiao Longfei 已提交
6407 6408 6409

    # add activation
    return helper.append_activation(out)
C
chengduo 已提交
6410 6411 6412 6413 6414


@templatedoc()
def get_tensor_from_selected_rows(x, name=None):
    """
6415 6416 6417 6418 6419 6420 6421 6422 6423
    This operator gets tensor data from input with SelectedRows type, and outputs a LoDTensor.

    .. code-block:: text

        input x is SelectedRows:
           x.rows = [0, 5, 5, 4, 19]
           x.height = 20
           x.value = [[1, 1] [2, 2] [2, 2] [3, 3] [6, 6]]

6424
        Output is LoDTensor:
6425 6426 6427 6428 6429 6430
           out.shape = [5, 2]
           out.data = [[1, 1],
                       [2, 2],
                       [2, 2],
                       [3, 3],
                       [6, 6]]
C
chengduo 已提交
6431 6432

    Args:
6433 6434 6435
        x(SelectedRows): Input with SelectedRows type. The data type is float32, float64, int32 or 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
chengduo 已提交
6436 6437

    Returns:
6438
        Variable: LoDTensor transformed from SelectedRows. The data type is same with input.
B
bdzhuxiaoning 已提交
6439 6440 6441

    Examples:
        .. code-block:: python
6442

B
bdzhuxiaoning 已提交
6443 6444 6445 6446
            import paddle.fluid as fluid
            b = fluid.default_main_program().global_block()
            input = b.create_var(name="X", dtype="float32", persistable=True, type=fluid.core.VarDesc.VarType.SELECTED_ROWS)
            out = fluid.layers.get_tensor_from_selected_rows(input)
C
chengduo 已提交
6447 6448
    """

6449 6450 6451 6452 6453
    check_type(x, 'x', Variable, 'get_tensor_from_selected_rows')
    if x.type != core.VarDesc.VarType.SELECTED_ROWS:
        raise TypeError(
            "The type of 'x' in get_tensor_from_selected_rows must be SELECTED_ROWS."
        )
C
chengduo 已提交
6454 6455
    helper = LayerHelper('get_tensor_from_selected_rows', **locals())
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
6456 6457 6458 6459 6460 6461
    helper.append_op(
        type='get_tensor_from_selected_rows',
        inputs={'X': x},
        outputs={'Out': out},
        attrs={},
    )
C
chengduo 已提交
6462
    return out
6463 6464


6465
@templatedoc()
6466
def temporal_shift(x, seg_num, shift_ratio=0.25, name=None, data_format="NCHW"):
6467
    """
6468

6469
    **Temporal Shift Operator**
6470

6471
    ${comment}
6472 6473

    Args:
6474
        x(Tensor): ${x_comment}
6475
        seg_num(int): ${seg_num_comment}
D
dengkaipeng 已提交
6476
        shift_ratio(float): ${shift_ratio_comment}
K
Kaipeng Deng 已提交
6477 6478 6479
        name(str, optional): For detailed information, please refer
                             to :ref:`api_guide_Name`. Usually name is no need to set and
                             None by default.
6480 6481
        data_format(str, optional): Data format that specifies the layout of input.
            It can be "NCHW" or "NHWC". Default: "NCHW".
6482 6483

    Returns:
6484
        out(Tensor): The temporal shifting result is a tensor with the
K
Kaipeng Deng 已提交
6485
        same shape and same data type as the input.
6486 6487 6488 6489 6490 6491 6492

    Raises:
        TypeError: seg_num must be int type.

    Examples:
        .. code-block:: python

6493 6494 6495 6496
            import paddle
            import paddle.nn.functional as F

            input = paddle.randn([6, 4, 2, 2])
6497
            out = F.temporal_shift(x=input, seg_num=2, shift_ratio=0.2)
6498
    """
6499 6500 6501
    return paddle.nn.functional.temporal_shift(
        x, seg_num, shift_ratio, name, data_format
    )
6502 6503


H
heqiaozhi 已提交
6504
def continuous_value_model(input, cvm, use_cvm=True):
6505
    r"""
H
fix doc  
heqiaozhi 已提交
6506

H
heqiaozhi 已提交
6507
    **continuous_value_model layers**
H
fix doc  
heqiaozhi 已提交
6508

Z
zhoushiyu 已提交
6509
    Now, this OP is used in CTR project to remove or dispose show and click value in :attr:`input`.
H
fix doc  
heqiaozhi 已提交
6510

Z
zhoushiyu 已提交
6511 6512
    :attr:`input` is an embedding vector including show and click value, whose shape is :math:`[N, D]` (N is batch size. D is `2 + embedding dim` ).
    Show and click at first two dims of embedding vector D.
T
tianshuo78520a 已提交
6513
    If :attr:`use_cvm` is True, it will calculate :math:`log(show)` and :math:`log(click)` , and output shape is :math:`[N, D]` .
Z
zhoushiyu 已提交
6514 6515
    If :attr:`use_cvm` is False, it will remove show and click from :attr:`input` , and output shape is :math:`[N, D - 2]` .
    :attr:`cvm` is show_click info, whose shape is :math:`[N, 2]` .
H
fix doc  
heqiaozhi 已提交
6516

Z
zhoushiyu 已提交
6517 6518 6519 6520 6521 6522 6523
    Args:
        input (Variable): The input variable. A 2-D LoDTensor with shape :math:`[N, D]` , where N is the batch size, D is `2 + the embedding dim` . `lod level = 1` .
        A Tensor with type float32, float64.
        cvm (Variable): Show and click variable. A 2-D Tensor with shape :math:`[N, 2]` , where N is the batch size, 2 is show and click.
        A Tensor with type float32, float64.
        use_cvm  (bool):  Use show_click or not. if use, the output dim is the same as input.
                          if not use, the output dim is `input dim - 2` (remove show and click)
H
fix doc  
heqiaozhi 已提交
6524

H
heqiaozhi 已提交
6525
    Returns:
H
fix doc  
heqiaozhi 已提交
6526

Z
zhoushiyu 已提交
6527 6528
        Variable: A 2-D LodTensor with shape :math:`[N, M]` . if :attr:`use_cvm` = True, M is equal to input dim D. if False, M is equal to `D - 2`. \
        A Tensor with same type as input.
H
fix doc  
heqiaozhi 已提交
6529

H
heqiaozhi 已提交
6530
    Examples:
H
fix doc  
heqiaozhi 已提交
6531

H
heqiaozhi 已提交
6532
        .. code-block:: python
H
fix doc  
heqiaozhi 已提交
6533

6534
          import paddle.fluid as fluid
Z
zhoushiyu 已提交
6535 6536
          input = fluid.data(name="input", shape=[64, 1], dtype="int64")
          label = fluid.data(name="label", shape=[64, 1], dtype="int64")
H
heqiaozhi 已提交
6537 6538 6539 6540 6541 6542 6543 6544
          embed = fluid.layers.embedding(
                            input=input,
                            size=[100, 11],
                            dtype='float32')
          ones = fluid.layers.fill_constant_batch_size_like(input=label, shape=[-1, 1], dtype="int64", value=1)
          show_clk = fluid.layers.cast(fluid.layers.concat([ones, label], axis=1), dtype='float32')
          show_clk.stop_gradient = True
          input_with_cvm = fluid.layers.continuous_value_model(embed, show_clk, True)
H
fix doc  
heqiaozhi 已提交
6545

H
heqiaozhi 已提交
6546 6547 6548
    """
    helper = LayerHelper('cvm', **locals())
    out = helper.create_variable(dtype=input.dtype)
6549 6550 6551 6552 6553 6554 6555 6556 6557
    check_variable_and_dtype(
        input, 'input', ['float16', 'float32', 'float64'], 'cvm'
    )
    helper.append_op(
        type='cvm',
        inputs={'X': [input], 'CVM': [cvm]},
        outputs={'Y': [out]},
        attrs={"use_cvm": use_cvm},
    )
H
heqiaozhi 已提交
6558
    return out
Z
zhoukunsheng 已提交
6559 6560


6561
def unfold(x, kernel_sizes, strides=1, paddings=0, dilations=1, name=None):
6562
    r"""
6563

S
SunGaofeng 已提交
6564
    This op returns a col buffer of sliding local blocks of input x, also known
6565
    as im2col for batched 2D image tensors. For each block under the convolution filter,
T
tianshuo78520a 已提交
6566
    all element will be rearranged as a column. While the convolution filter sliding over
6567 6568
    the input feature map, a series of such columns will be formed.

S
SunGaofeng 已提交
6569
    For each input :math:`x` with shape [N, C, H, W], the output shape [N, Cout, Lout]
6570 6571 6572 6573
    can be calculated as following.

    .. math::

6574
        dkernel[0] &= dilations[0] \times (kernel\_sizes[0] - 1) + 1
6575

6576
        dkernel[1] &= dilations[1] \times (kernel\_sizes[1] - 1) + 1
6577

6578
        hout &= \frac{H + paddings[0] + paddings[2] - dkernel[0]}{strides[0]} + 1
6579

6580
        wout &= \frac{W + paddings[1] + paddings[3] - dkernel[1]}{strides[1]} + 1
6581

6582
        Cout &= C \times kernel\_sizes[0] \times kernel\_sizes[1]
6583

6584
        Lout &= hout \times wout
6585 6586


S
SunGaofeng 已提交
6587
    Parameters:
6588
        x(Tensor):              4-D Tensor, input tensor of format [N, C, H, W],
S
SunGaofeng 已提交
6589
                                  data type can be float32 or float64
6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601
        kernel_sizes(int|list):   The size of convolution kernel, should be [k_h, k_w]
                                  or an integer k treated as [k, k].
        strides(int|list):        The strides, should be [stride_h, stride_w]
                                  or an integer stride treated as [sride, stride].
                                  For default, strides will be [1, 1].
        paddings(int|list):       The paddings of each dimension, should be
                                  [padding_top, padding_left, padding_bottom, padding_right]
                                  or [padding_h, padding_w] or an integer padding.
                                  If [padding_h, padding_w] was given, it will expanded to
                                  [padding_h, padding_w, padding_h, padding_w]. If an integer
                                  padding was given, [padding, padding, padding, padding] will
                                  be used. For default, paddings will be [0, 0, 0, 0]
T
tianshuo78520a 已提交
6602
        dilations(int|list):      the dilations of convolution kernel, should be
T
tianshuo78520a 已提交
6603
                                  [dilation_h, dilation_w], or an integer dilation treated as
6604
                                  [dilation, dilation]. For default, it will be [1, 1].
6605 6606
        name(str, optional): The default value is None.
                             Normally there is no need for user to set this property.
S
SunGaofeng 已提交
6607
                             For more information, please refer to :ref:`api_guide_Name`
6608

6609

6610
    Returns:
6611
        The tensor corresponding to the sliding local blocks.
6612 6613 6614
        The output shape is [N, Cout, Lout] as decriabled above.
        Cout is the  total number of values within each block,
        and Lout is the total number of such blocks.
S
SunGaofeng 已提交
6615 6616 6617
        The data type of output is the same as the input :math:`x`

    Return Type:
6618
        Tensor
6619 6620 6621 6622 6623

    Examples:

        .. code-block:: python

6624 6625 6626 6627 6628
            import paddle
            import paddle.nn.functional as F

            x = paddle.randn((100,3,224,224))
            y = F.unfold(x, [3, 3], 1, 1, 1)
6629 6630
    """

6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650
    return paddle.nn.functional.unfold(
        x, kernel_sizes, strides, paddings, dilations, name
    )


def deformable_roi_pooling(
    input,
    rois,
    trans,
    no_trans=False,
    spatial_scale=1.0,
    group_size=[1, 1],
    pooled_height=1,
    pooled_width=1,
    part_size=None,
    sample_per_part=1,
    trans_std=0.1,
    position_sensitive=False,
    name=None,
):
6651
    r"""
6652

6653
    Deformable ROI Pooling Layer
6654

6655
    Performs deformable region-of-interest pooling on inputs. As described
6656
    in `Deformable Convolutional Networks <https://arxiv.org/abs/1703.06211>`_, it will get offset for each bin after
6657
    roi pooling so that pooling at correct region. Batch_size will change to the number of region bounding boxes after deformable_roi_pooling.
6658

6659
    The operation has three steps:
6660

6661
    1. Dividing each region proposal into equal-sized sections with the pooled_width and pooled_height.
6662

6663 6664
    2. Add offset to pixel in ROI to get new location and the new value which are computed directly through
       bilinear interpolation with four nearest pixel.
6665

6666
    3. Sample several points in each bin to get average values as output.
6667 6668


6669 6670 6671 6672 6673 6674 6675 6676 6677
    Args:
        input (Variable):The input of deformable roi pooling and it is tensor which value type is float32. The shape of input is
                         [N, C, H, W]. Where N is batch size, C is number of input channels,
                         H is height of the feature, and W is the width of the feature.
        rois (Variable): ROIs (Regions of Interest) with type float32 to pool over. It should be
                         a 2-D LoDTensor of shape (num_rois, 4), and the lod level
                         is 1. Given as [[x1, y1, x2, y2], ...], (x1, y1) is
                         the top left coordinates, and (x2, y2) is the bottom
                         right coordinates, which value type is float32.
6678 6679 6680
        trans (Variable): Offset of features on ROIs while pooling which value type is float32. The format is [N, C, H, W], where
                          N is number of ROIs, C is number of channels, which indicate the offset distance
                          in the x and y directions, H is pooled height, and W is pooled width.
6681 6682 6683 6684
        no_trans (bool): Whether to add offset to get new value or not while roi pooling, which value with type bool is True or False.
                         If value is True, no offset will be added in operation. Default: False.
        spatial_scale (float): Ratio of input feature map height (or width) to raw image height (or width), which value type is float32.
                         Equals the reciprocal of total stride in convolutional layers, Default: 1.0.
6685
        group_size (list|tuple): The number of groups which input channels are divided and the input is list or tuple, which value type is int32. (eg.number of input channels
6686
                          is k1 * k2 * (C + 1), which k1 and k2 are group width and height and C+1 is number of output
T
tianshuo78520a 已提交
6687
                          channels.) eg.(4, 6), which 4 is height of group and 6 is width of group. Default: [1, 1].
6688 6689 6690 6691 6692 6693 6694
        pooled_height (int): The pooled output height which value type is int32. Default: 1.
        pooled_width (int): The pooled output width which value type is int32. Default: 1.
        part_size (list|tuple): The height and width of offset which values in list or tuple is int32, eg.(4, 6), which height is 4 and width is 6, and values always equal to pooled_height \
                         and pooled_width. Default: if None, default value is [pooled_height, pooled_width].
        sample_per_part (int): The number of samples in each bin which value type is int32. If value is bigger, it will consume more performance. Default: 1.
        trans_std (float): Coefficient of offset which value type is float32. It controls weight of offset. Default: 0.1.
        position_sensitive (bool): Whether to choose deformable psroi pooling mode or not, and value type is bool(True or False). If value is False, input dimension equals to output dimension. \
T
tianshuo78520a 已提交
6695
                                   If value is True, input dimension should be output dimension * pooled_height * pooled_width. Default: False.
6696 6697 6698 6699
        name (str|None): Name of layer. Default: None.
    Returns:
        Variable: Output of deformable roi pooling is that, if position sensitive is False, input dimension equals to output dimension. If position sensitive is True,\
                  input dimension should be the result of output dimension divided by pooled height and pooled width.
C
cjt222 已提交
6700 6701 6702 6703

    Examples:
      .. code-block:: python

6704 6705
        # position_sensitive=True
        import paddle.fluid as fluid
C
chengjuntao 已提交
6706
        input = fluid.data(name="input",
6707 6708
                           shape=[2, 192, 64, 64],
                           dtype='float32')
C
chengjuntao 已提交
6709 6710
        rois = fluid.data(name="rois",
                          shape=[-1, 4],
6711
                          dtype='float32',
C
chengjuntao 已提交
6712 6713
                          lod_level=1)
        trans = fluid.data(name="trans",
6714 6715 6716 6717 6718
                           shape=[2, 384, 64, 64],
                           dtype='float32')
        x = fluid.layers.deformable_roi_pooling(input=input,
                                                rois=rois,
                                                trans=trans,
C
chengjuntao 已提交
6719
                                                no_trans=False,
6720
                                                spatial_scale=1.0,
C
chengjuntao 已提交
6721 6722 6723 6724
                                                group_size=(1, 1),
                                                pooled_height=8,
                                                pooled_width=8,
                                                part_size=(8, 8),
6725
                                                sample_per_part=4,
C
chengjuntao 已提交
6726 6727
                                                trans_std=0.1,
                                                position_sensitive=True)
6728

6729
        # position_sensitive=False
6730
        import paddle.fluid as fluid
C
chengjuntao 已提交
6731
        input = fluid.data(name="input",
6732 6733
                           shape=[2, 192, 64, 64],
                           dtype='float32')
C
chengjuntao 已提交
6734 6735
        rois = fluid.data(name="rois",
                          shape=[-1, 4],
6736
                          dtype='float32',
C
chengjuntao 已提交
6737 6738
                          lod_level=1)
        trans = fluid.data(name="trans",
6739 6740 6741 6742 6743
                           shape=[2, 384, 64, 64],
                           dtype='float32')
        x = fluid.layers.deformable_roi_pooling(input=input,
                                                rois=rois,
                                                trans=trans,
C
chengjuntao 已提交
6744
                                                no_trans=False,
6745
                                                spatial_scale=1.0,
C
chengjuntao 已提交
6746 6747 6748 6749
                                                group_size=(1, 1),
                                                pooled_height=8,
                                                pooled_width=8,
                                                part_size=(8, 8),
6750
                                                sample_per_part=4,
C
chengjuntao 已提交
6751 6752
                                                trans_std=0.1,
                                                position_sensitive=False)
C
cjt222 已提交
6753 6754
    """

6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766
    check_variable_and_dtype(
        input, 'input', ['float32', 'float64'], 'deformable_roi_pooling'
    )
    check_variable_and_dtype(
        rois, 'rois', ['float32', 'float64'], 'deformable_roi_pooling'
    )
    check_variable_and_dtype(
        trans, 'trans', ['float32', 'float64'], 'deformable_roi_pooling'
    )
    check_type(
        group_size, 'group_size', (list, tuple), 'deformable_roi_pooling'
    )
6767
    if part_size is not None:
6768 6769 6770
        check_type(
            part_size, 'part_size', (list, tuple), 'deformable_roi_pooling'
        )
6771

C
cjt222 已提交
6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787
    input_channels = input.shape[1]
    if position_sensitive == False:
        output_channels = input_channels
    else:
        output_channels = input_channels / pooled_height / pooled_width

    if part_size is None:
        part_height = pooled_height
        part_width = pooled_width
        part_size = [part_height, part_width]
    part_size = utils.convert_to_list(part_size, 2, 'part_size')
    group_size = utils.convert_to_list(group_size, 2, 'group_size')
    helper = LayerHelper('deformable_psroi_pooling', **locals())
    dtype = helper.input_dtype()
    output = helper.create_variable_for_type_inference(dtype)
    top_count = helper.create_variable_for_type_inference(dtype='int32')
6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803
    helper.append_op(
        type="deformable_psroi_pooling",
        inputs={"Input": input, "ROIs": rois, "Trans": trans},
        outputs={"Output": output, "TopCount": top_count},
        attrs={
            "no_trans": no_trans,
            "spatial_scale": spatial_scale,
            "output_dim": output_channels,
            "group_size": group_size,
            "pooled_height": pooled_height,
            "pooled_width": pooled_width,
            "part_size": part_size,
            "sample_per_part": sample_per_part,
            "trans_std": trans_std,
        },
    )
C
cjt222 已提交
6804
    return output
6805 6806


6807
@deprecated(since="2.0.0", update_to="paddle.shard_index")
6808 6809
def shard_index(input, index_num, nshards, shard_id, ignore_value=-1):
    """
L
lilong12 已提交
6810 6811 6812 6813 6814 6815 6816 6817 6818
    Reset the values of `input` according to the shard it beloning to.
    Every value in `input` must be a non-negative integer, and
    the parameter `index_num` represents the integer above the maximum
    value of `input`. Thus, all values in `input` must be in the range
    [0, index_num) and each value can be regarded as the offset to the beginning
    of the range. The range is further split into multiple shards. Specifically,
    we first compute the `shard_size` according to the following formula,
    which represents the number of integers each shard can hold. So for the
    i'th shard, it can hold values in the range [i*shard_size, (i+1)*shard_size).
6819 6820
    ::

6821
        shard_size = (index_num + nshards - 1) // nshards
6822

L
lilong12 已提交
6823 6824 6825
    For each value `v` in `input`, we reset it to a new value according to the
    following formula:
    ::
6826

L
lilong12 已提交
6827 6828 6829 6830
        v = v - shard_id * shard_size if shard_id * shard_size <= v < (shard_id+1) * shard_size else ignore_value

    That is, the value `v` is set to the new offset within the range represented by the shard `shard_id`
    if it in the range. Otherwise, we reset it to be `ignore_value`.
6831 6832

    Args:
L
lilong12 已提交
6833 6834
        input (Tensor): Input tensor with data type int64 or int32. It's last dimension must be 1.
        index_num (int): An integer represents the integer above the maximum value of `input`.
6835 6836 6837
        nshards (int): The number of shards.
        shard_id (int): The index of the current shard.
        ignore_value (int): An integer value out of sharded index range.
6838 6839

    Returns:
L
lilong12 已提交
6840
        Tensor.
6841 6842 6843 6844

    Examples:
        .. code-block:: python

6845 6846 6847 6848 6849 6850 6851 6852
            import paddle
            label = paddle.to_tensor([[16], [1]], "int64")
            shard_label = paddle.shard_index(input=label,
                                             index_num=20,
                                             nshards=2,
                                             shard_id=0)
            print(shard_label)
            # [[-1], [1]]
6853
    """
H
hong 已提交
6854
    if in_dygraph_mode():
6855 6856 6857
        return _C_ops.shard_index(
            input, index_num, nshards, shard_id, ignore_value
        )
H
hong 已提交
6858

B
Baibaifan 已提交
6859
    check_variable_and_dtype(input, 'input', ['int64', 'int32'], 'shard_index')
6860 6861 6862
    op_type = 'shard_index'
    helper = LayerHelper(op_type, **locals())
    if shard_id < 0 or shard_id >= nshards:
6863 6864 6865
        raise ValueError(
            'The shard_id(%d) should be in [0, %d)' % (shard_id, nshards)
        )
6866 6867

    out = helper.create_variable_for_type_inference(dtype=input.dtype)
6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879
    helper.append_op(
        type=op_type,
        inputs={'X': [input]},
        outputs={'Out': out},
        attrs={
            'index_num': index_num,
            'nshards': nshards,
            'shard_id': shard_id,
            'ignore_value': ignore_value,
        },
        stop_gradient=True,
    )
6880
    return out
H
huangjun12 已提交
6881 6882 6883 6884


@templatedoc()
def hard_swish(x, threshold=6.0, scale=6.0, offset=3.0, name=None):
6885
    r"""
6886 6887 6888
    This operator implements the hard_swish activation function.
    Hard_swish is proposed in MobileNetV3, and performs better in computational stability and efficiency compared to swish function.
    For more details please refer to: https://arxiv.org/pdf/1905.02244.pdf
H
huangjun12 已提交
6889

6890
    The formula is as follows:
H
huangjun12 已提交
6891

6892
    .. math::
H
huangjun12 已提交
6893

6894
        out = \\frac{x * (min(max(0, x+offset), threshold))}{scale}
H
huangjun12 已提交
6895

6896 6897 6898 6899 6900 6901 6902 6903 6904
    In the above equation:

    ``threshold`` and ``scale`` should be positive, ``offset`` can be positive or negative. It is recommended to use default parameters.

    Args:
        x (Variable): Input feature, multi-dimensional Tensor. The data type should be float32 or float64.
        threshold (float, optional): The threshold in Relu function. Default: 6.0
        scale (float, optional): The scale factor. Default: 6.0
        offset (float, optional): The offset factor. Default: 3.0
6905 6906
        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`

6907 6908
    Returns:
        Variable: The output tensor with the same shape and data type as input.
6909 6910


6911
    Examples:
6912

6913
    .. code-block:: python
6914

6915
        import paddle.fluid as fluid
6916
        import paddle
6917
        import numpy as np
6918
        paddle.enable_static()
6919

6920
        DATATYPE='float32'
6921

6922
        x_data = np.array([i for i in range(1,5)]).reshape([1,1,4]).astype(DATATYPE)
6923

6924 6925
        x = fluid.data(name="x", shape=[None,1,4], dtype=DATATYPE)
        y = fluid.layers.hard_swish(x)
6926

6927 6928 6929 6930 6931
        place = fluid.CPUPlace()
        #place = fluid.CUDAPlace(0)
        exe = fluid.Executor(place)
        out, = exe.run(feed={'x':x_data}, fetch_list=[y.name])
        print(out)  # [[0.66666667, 1.66666667,3., 4.]]
H
huangjun12 已提交
6932
    """
J
Jiabin Yang 已提交
6933
    if _non_static_mode():
6934 6935 6936
        return _legacy_C_ops.hard_swish(
            x, 'threshold', threshold, 'scale', scale, 'offset', offset
        )
6937

6938 6939 6940
    check_variable_and_dtype(
        x, 'x', ['float16', 'float32', 'float64'], 'hard_swish'
    )
6941

H
huangjun12 已提交
6942 6943
    helper = LayerHelper('hard_swish', **locals())
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
6944 6945 6946 6947 6948 6949
    helper.append_op(
        type='hard_swish',
        inputs={'X': x},
        outputs={'Out': out},
        attrs={'threshold': threshold, 'scale': scale, 'offset': offset},
    )
H
huangjun12 已提交
6950
    return out
R
ruri 已提交
6951 6952


K
Kaipeng Deng 已提交
6953 6954
@templatedoc()
def mish(x, threshold=20, name=None):
6955
    r"""
K
Kaipeng Deng 已提交
6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012
    This operator implements the mish activation function.
    Refer to `Mish: A Self Regularized Non-Monotonic Neural
    Activation Function <https://arxiv.org/abs/1908.08681>`_


    The formula is as follows if :attr:`threshold` is :code:`None` or negative:

    .. math::

        out = x * \\tanh(\\ln(1 + e^{x}))

    The formula is as follows if :attr:`threshold` is set as positive value:

    .. math::

	out = \\begin{cases}
		x \\ast \\tanh(x), \\text{if } x > \\text{threshold} \\\\
		x \\ast \\tanh(e^{x}), \\text{if } x < -\\text{threshold} \\\\
		x \\ast \\tanh(\\ln(1 + e^{x})),  \\text{otherwise}
	      \\end{cases}

    Args:
        x (Variable): Input feature, multi-dimensional Tensor. The data type
                      should be float16, float32 or float64.
        threshold (float|None): threshold for softplus in Mish operator.
                Approximate value of softplus will be used if absolute value
                of input is greater than :attr:threshold and :attr:threshold
                is set as positive value. For none or negative threshold,
                approximate value is not used. Default 20.
        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:
        Variable: The output tensor with the same shape and data type as input.


    Examples:

    .. code-block:: python

        import paddle.fluid as fluid
        import numpy as np

        DATATYPE='float32'

        x_data = np.array([i for i in range(1,5)]).reshape([1,1,4]).astype(DATATYPE)

        x = fluid.data(name="x", shape=[None,1,4], dtype=DATATYPE)
        y = fluid.layers.mish(x)

        place = fluid.CPUPlace()
        # place = fluid.CUDAPlace(0)
        exe = fluid.Executor(place)
        out, = exe.run(feed={'x':x_data}, fetch_list=[y.name])
        print(out)  # [[0.66666667, 1.66666667, 3., 4.]]
    """
7013
    if in_dygraph_mode():
7014
        return _C_ops.mish(x, threshold)
7015
    if _in_legacy_dygraph():
7016
        return _legacy_C_ops.mish(x, 'threshold', threshold)
7017

K
Kaipeng Deng 已提交
7018 7019
    check_variable_and_dtype(x, 'x', ['float32', 'float64'], 'mish')
    check_type(threshold, 'threshold', (float, int), 'mish')
7020 7021 7022 7023 7024
    assert (
        threshold > 0
    ), "threshold of mish should be greater than 0, " "but got {}".format(
        threshold
    )
K
Kaipeng Deng 已提交
7025 7026 7027

    helper = LayerHelper('mish', **locals())
    out = helper.create_variable_for_type_inference(dtype=x.dtype)
7028 7029 7030 7031 7032 7033
    helper.append_op(
        type='mish',
        inputs={'X': x},
        outputs={'Out': out},
        attrs={'threshold': threshold},
    )
K
Kaipeng Deng 已提交
7034 7035 7036
    return out


7037
@deprecated(since="2.0.0", update_to="paddle.uniform")
7038
@templatedoc()
7039 7040 7041
def uniform_random(
    shape, dtype='float32', min=-1.0, max=1.0, seed=0, name=None
):
7042
    """
7043 7044
    This OP returns a Tensor filled with random values sampled from a uniform
    distribution in the range [``min``, ``max``), with ``shape`` and ``dtype``.
7045 7046 7047

    Examples:
    ::
7048

7049 7050
        Input:
          shape = [1, 2]
7051

7052 7053 7054 7055
        Output:
          result=[[0.8505902, 0.8397286]]

    Args:
7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068
        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.
            Default is float32.
        min(float|int, optional): The lower bound on the range of random values
            to generate, ``min`` is included in the range. Default is -1.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. 0 means
7069 7070
            use a seed generated by the system. Note that if seed is not 0,
            this operator will always generate the same random numbers every
7071
            time. Default is 0.
7072 7073 7074
        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`.
7075

7076
    Returns:
7077 7078
        Tensor: A Tensor filled with random values sampled from a uniform
        distribution in the range [``min``, ``max``), with ``shape`` and ``dtype``.
7079

7080
    Raises:
7081 7082
        TypeError: If ``shape`` is not list, tuple, Tensor.
        TypeError: If ``dtype`` is not float32, float64.
7083

7084 7085 7086
    Examples:
        .. code-block:: python

7087
            import paddle
7088
            import paddle.fluid as fluid
7089
            paddle.enable_static()
7090 7091

            # example 1:
7092
            # attr shape is a list which doesn't contain Tensor.
7093
            result_1 = fluid.layers.uniform_random(shape=[3, 4])
7094 7095 7096
            # [[ 0.84524226,  0.6921872,   0.56528175,  0.71690357],
            #  [-0.34646994, -0.45116323, -0.09902662, -0.11397249],
            #  [ 0.433519,    0.39483607, -0.8660099,   0.83664286]]
7097 7098

            # example 2:
7099 7100 7101
            # attr shape is a list which contains Tensor.
            dim_1 = fluid.layers.fill_constant([1], "int64", 2)
            dim_2 = fluid.layers.fill_constant([1], "int32", 3)
7102
            result_2 = fluid.layers.uniform_random(shape=[dim_1, dim_2])
7103 7104
            # [[-0.9951253,   0.30757582, 0.9899647 ],
            #  [ 0.5864527,   0.6607096,  -0.8886161 ]]
7105 7106

            # example 3:
7107
            # attr shape is a Tensor, the data type must be int64 or int32.
7108
            var_shape = fluid.data(name='var_shape', shape=[2], dtype="int64")
7109
            result_3 = fluid.layers.uniform_random(var_shape)
7110 7111 7112 7113
            # if var_shape's value is [2, 3]
            # result_3 is:
            # [[-0.8517412,  -0.4006908,   0.2551912 ],
            #  [ 0.3364414,   0.36278176, -0.16085452]]
7114

7115 7116 7117
    """
    if not isinstance(dtype, core.VarDesc.VarType):
        dtype = convert_np_dtype_to_dtype_(dtype)
7118

7119 7120
    if in_dygraph_mode():
        shape = utils.convert_shape_to_list(shape)
7121
        return _C_ops.uniform(
7122 7123 7124 7125 7126 7127 7128
            shape,
            dtype,
            float(min),
            float(max),
            seed,
            _current_expected_place(),
        )
7129
    elif _in_legacy_dygraph():
7130
        shape = utils.convert_shape_to_list(shape)
7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142
        return _legacy_C_ops.uniform_random(
            'shape',
            shape,
            'min',
            float(min),
            'max',
            float(max),
            'seed',
            seed,
            'dtype',
            dtype,
        )
7143

7144
    check_type(shape, 'shape', (list, tuple, Variable), 'uniform_random/rand')
7145 7146 7147
    check_dtype(
        dtype, 'dtype', ('float32', 'float64', 'uint16'), 'uniform_random/rand'
    )
7148 7149
    check_type(min, 'min', (float, int, Variable), 'uniform_random/rand')
    check_type(max, 'max', (float, int, Variable), 'uniform_random/rand')
7150 7151

    inputs = dict()
7152
    attrs = {'seed': seed, 'min': min, 'max': max, 'dtype': dtype}
7153 7154 7155
    utils.get_shape_tensor_inputs(
        inputs=inputs, attrs=attrs, shape=shape, op_type='uniform_random/rand'
    )
7156

7157
    helper = LayerHelper("uniform_random", **locals())
7158
    out = helper.create_variable_for_type_inference(dtype)
7159 7160 7161
    helper.append_op(
        type="uniform_random", inputs=inputs, attrs=attrs, outputs={"Out": out}
    )
7162
    utils.try_set_static_shape_tensor(out, shape)
7163
    return out
myq406450149's avatar
myq406450149 已提交
7164 7165 7166 7167 7168 7169 7170


def unbind(input, axis=0):
    """
    Removes a tensor dimension, then split the input tensor into multiple sub-Tensors.
    Args:
        input (Variable): The input variable which is an N-D Tensor, data type being float32, float64, int32 or int64.
7171

myq406450149's avatar
myq406450149 已提交
7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196
        axis (int32|int64, optional): A scalar with type ``int32|int64`` shape [1]. The dimension along which to unbind. If :math:`axis < 0`, the
            dimension to unbind along is :math:`rank(input) + axis`. Default is 0.
    Returns:
        list(Variable): The list of segmented Tensor variables.

    Example:
        .. code-block:: python
            import paddle
            # input is a variable which shape is [3, 4, 5]
            input = paddle.fluid.data(
                 name="input", shape=[3, 4, 5], dtype="float32")
            [x0, x1, x2] = paddle.tensor.unbind(input, axis=0)
            # x0.shape [4, 5]
            # x1.shape [4, 5]
            # x2.shape [4, 5]
            [x0, x1, x2, x3] = paddle.tensor.unbind(input, axis=1)
            # x0.shape [3, 5]
            # x1.shape [3, 5]
            # x2.shape [3, 5]
            # x3.shape [3, 5]

    """
    helper = LayerHelper("unbind", **locals())
    check_type(input, 'input', (Variable), 'unbind')
    dtype = helper.input_dtype()
7197 7198 7199
    check_dtype(
        dtype, 'unbind', ['float32', 'float64', 'int32', 'int64'], 'unbind'
    )
myq406450149's avatar
myq406450149 已提交
7200
    if not isinstance(axis, (int)):
7201 7202 7203
        raise TypeError(
            "The type of 'axis'  must be int, but received %s." % (type(axis))
        )
myq406450149's avatar
myq406450149 已提交
7204 7205 7206 7207 7208 7209 7210 7211 7212 7213
    if isinstance(axis, np.generic):
        axis = np.asscalar(axis)
    input_shape = input.shape
    axis_ = axis if axis >= 0 else len(input_shape) + axis
    num = input_shape[axis_]
    outs = [
        helper.create_variable_for_type_inference(dtype=helper.input_dtype())
        for i in range(num)
    ]

7214 7215 7216 7217 7218 7219
    helper.append_op(
        type="unbind",
        inputs={"X": input},
        outputs={"Out": outs},
        attrs={"axis": axis},
    )
myq406450149's avatar
myq406450149 已提交
7220
    return outs