ops.py 18.6 KB
Newer Older
1
#   Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
D
dzhwinter 已提交
2
#
3 4 5
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
D
dzhwinter 已提交
6
#
D
dzhwinter 已提交
7
#     http://www.apache.org/licenses/LICENSE-2.0
D
dzhwinter 已提交
8
#
9 10 11 12 13
# 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.
14 15

from __future__ import print_function
P
peizhilin 已提交
16
import os
17
from .layer_function_generator import generate_layer_fn, generate_activation_fn, add_sample_code
C
chengduo 已提交
18
from .. import core
19 20
from ..framework import convert_np_dtype_to_dtype_, Variable
from ..data_feeder import convert_dtype, check_variable_and_dtype, check_type, check_dtype
21
from paddle.utils import deprecated
Y
Yang Yu 已提交
22

23 24 25 26
__deprecated_func_name__ = {
    'tanh_shrink': 'tanhshrink',
    'logsigmoid': 'log_sigmoid'
}
27

28
__activations_noattr__ = [
29 30
    'sigmoid',
    'logsigmoid',
31 32 33
    'tanh_shrink',
    'softplus',
    'softsign',
W
WangXi 已提交
34
    'tanh',
35 36 37
]

__unary_func__ = [
38
    'exp',
39
    'atan',
40
    'sqrt',
Z
zhoukunsheng 已提交
41
    'rsqrt',
42 43 44
    'abs',
    'ceil',
    'floor',
C
add cos  
chengduoZH 已提交
45
    'cos',
46
    'acos',
C
add sin  
chengduoZH 已提交
47
    'sin',
48
    'sinh',
49
    'asin',
50
    'cosh',
51 52 53
    'round',
    'reciprocal',
    'square',
Y
Yu Yang 已提交
54 55
]

X
Xin Pan 已提交
56
__all__ = []
Y
Yang Yu 已提交
57

Y
Yu Yang 已提交
58
for _OP in set(__all__):
59
    globals()[_OP] = generate_layer_fn(_OP)
Y
yuyang18 已提交
60

S
sneaxiy 已提交
61 62 63 64 65
# It is a hot fix in some unittest using:
#   fluid.layers.scale(x=x, scale=10.0, out=out_var)
# e.g.: test_program_code.py, test_dist_train.py
globals()['_scale'] = generate_layer_fn('scale')

S
sneaxiy 已提交
66 67
globals()['_elementwise_div'] = generate_layer_fn('elementwise_div')

68
__all__ += __activations_noattr__
69
__all__ += __unary_func__
70 71

for _OP in set(__activations_noattr__):
72 73 74
    _new_OP = _OP
    if _OP in __deprecated_func_name__:
        _new_OP = __deprecated_func_name__[_OP]
75 76
    func = generate_activation_fn(_OP)
    func = deprecated(
77
        since="2.0.0", update_to="paddle.nn.functional.%s" % (_new_OP))(func)
78 79 80
    globals()[_OP] = func

for _OP in set(__unary_func__):
81 82 83
    _new_OP = _OP
    if _OP in __deprecated_func_name__:
        _new_OP = __deprecated_func_name__[_OP]
84
    func = generate_activation_fn(_OP)
85
    func = deprecated(since="2.0.0", update_to="paddle.%s" % (_new_OP))(func)
86
    globals()[_OP] = func
87

88 89 90 91 92 93
add_sample_code(globals()["sigmoid"], r"""
Examples:
    .. code-block:: python

        import paddle
        import paddle.nn.functional as F
94
        paddle.disable_static()
95

96
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
97 98 99 100 101 102 103 104 105 106 107 108
        out = F.sigmoid(x)
        print(out.numpy())
        # [0.40131234 0.450166   0.52497919 0.57444252]

""")

add_sample_code(globals()["logsigmoid"], r"""
Examples:
    .. code-block:: python

        import paddle
        import paddle.nn.functional as F
109
        paddle.disable_static()
110

111
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
112
        out = F.log_sigmoid(x)
113 114 115 116 117 118 119 120 121 122
        print(out.numpy())
        # [-0.91301525 -0.79813887 -0.64439666 -0.55435524]

""")

add_sample_code(globals()["exp"], r"""
Examples:
    .. code-block:: python

        import paddle
123
        paddle.disable_static()
124

125
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
126 127 128 129 130 131 132 133 134 135 136
        out = paddle.exp(x)
        print(out.numpy())
        # [0.67032005 0.81873075 1.10517092 1.34985881]

""")

add_sample_code(globals()["tanh"], r"""
Examples:
    .. code-block:: python

        import paddle
137
        paddle.disable_static()
138

139
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
140 141 142 143 144 145 146 147 148 149 150
        out = paddle.tanh(x)
        print(out.numpy())
        # [-0.37994896 -0.19737532  0.09966799  0.29131261]

""")

add_sample_code(globals()["atan"], r"""
Examples:
    .. code-block:: python

        import paddle
151
        paddle.disable_static()
152

153
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
154 155 156 157 158 159 160 161 162 163 164 165
        out = paddle.atan(x)
        print(out.numpy())
        # [-0.38050638 -0.19739556  0.09966865  0.29145679]

""")

add_sample_code(globals()["tanh_shrink"], r"""
Examples:
    .. code-block:: python

        import paddle
        import paddle.nn.functional as F
166

167
        paddle.disable_static()
168

169
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
170
        out = F.tanhshrink(x) # [-0.020051, -0.00262468, 0.000332005, 0.00868739]
171 172 173 174 175 176 177 178

""")

add_sample_code(globals()["sqrt"], r"""
Examples:
    .. code-block:: python

        import paddle
179
        paddle.disable_static()
180

181
        x = paddle.to_tensor([0.1, 0.2, 0.3, 0.4])
182 183 184 185 186 187 188 189 190 191 192 193
        out = paddle.sqrt(x)
        print(out.numpy())
        # [0.31622777 0.4472136  0.54772256 0.63245553]

""")

add_sample_code(globals()["rsqrt"], r"""
Examples:
    .. code-block:: python

        import paddle

194
        x = paddle.to_tensor([0.1, 0.2, 0.3, 0.4])
195 196 197 198 199 200 201 202 203 204
        out = paddle.rsqrt(x)
        # [3.16227766 2.23606798 1.82574186 1.58113883]

""")

add_sample_code(globals()["abs"], r"""
Examples:
    .. code-block:: python

        import paddle
205
        paddle.disable_static()
206

207
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
208 209 210 211 212 213 214 215 216 217 218
        out = paddle.abs(x)
        print(out.numpy())
        # [0.4 0.2 0.1 0.3]

""")

add_sample_code(globals()["ceil"], r"""
Examples:
    .. code-block:: python

        import paddle
219
        paddle.disable_static()
220

221
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
222 223 224 225 226 227 228 229 230 231 232
        out = paddle.ceil(x)
        print(out.numpy())
        # [-0. -0.  1.  1.]

""")

add_sample_code(globals()["floor"], r"""
Examples:
    .. code-block:: python

        import paddle
233
        paddle.disable_static()
234

235
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
236 237 238 239 240 241 242 243 244 245 246
        out = paddle.floor(x)
        print(out.numpy())
        # [-1. -1.  0.  0.]

""")

add_sample_code(globals()["cos"], r"""
Examples:
    .. code-block:: python

        import paddle
247
        paddle.disable_static()
248

249
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
250 251 252 253 254 255 256 257 258 259 260
        out = paddle.cos(x)
        print(out.numpy())
        # [0.92106099 0.98006658 0.99500417 0.95533649]

""")

add_sample_code(globals()["acos"], r"""
Examples:
    .. code-block:: python

        import paddle
261
        paddle.disable_static()
262

263
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
264 265 266 267 268 269 270 271 272 273 274
        out = paddle.acos(x)
        print(out.numpy())
        # [1.98231317 1.77215425 1.47062891 1.26610367]

""")

add_sample_code(globals()["sin"], r"""
Examples:
    .. code-block:: python

        import paddle
275
        paddle.disable_static()
276

277
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
278 279 280 281 282 283 284 285 286 287 288
        out = paddle.sin(x)
        print(out.numpy())
        # [-0.38941834 -0.19866933  0.09983342  0.29552021]

""")

add_sample_code(globals()["asin"], r"""
Examples:
    .. code-block:: python

        import paddle
289
        paddle.disable_static()
290

291
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
292 293 294 295 296 297 298 299 300 301 302
        out = paddle.asin(x)
        print(out.numpy())
        # [-0.41151685 -0.20135792  0.10016742  0.30469265]

""")

add_sample_code(globals()["cosh"], r"""
Examples:
    .. code-block:: python

        import paddle
303
        paddle.disable_static()
304

305
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
306 307 308 309 310 311 312 313 314 315 316
        out = paddle.cosh(x)
        print(out.numpy())
        # [1.08107237 1.02006676 1.00500417 1.04533851]

""")

add_sample_code(globals()["sinh"], r"""
Examples:
    .. code-block:: python

        import paddle
317
        paddle.disable_static()
318

319
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
320 321 322 323 324 325 326 327 328 329 330
        out = paddle.sinh(x)
        print(out.numpy())
        # [-0.41075233 -0.201336    0.10016675  0.30452029]

""")

add_sample_code(globals()["round"], r"""
Examples:
    .. code-block:: python

        import paddle
331
        paddle.disable_static()
332

333
        x = paddle.to_tensor([-0.5, -0.2, 0.6, 1.5])
334 335 336 337 338 339 340 341 342 343 344
        out = paddle.round(x)
        print(out.numpy())
        # [-1. -0.  1.  2.]

""")

add_sample_code(globals()["reciprocal"], r"""
Examples:
    .. code-block:: python

        import paddle
345
        paddle.disable_static()
346

347
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
348 349 350 351 352 353 354 355 356 357 358
        out = paddle.reciprocal(x)
        print(out.numpy())
        # [-2.5        -5.         10.          3.33333333]

""")

add_sample_code(globals()["square"], r"""
Examples:
    .. code-block:: python

        import paddle
359
        paddle.disable_static()
360

361
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
362 363 364 365 366 367 368 369 370 371 372 373
        out = paddle.square(x)
        print(out.numpy())
        # [0.16 0.04 0.01 0.09]

""")

add_sample_code(globals()["softplus"], r"""
Examples:
    .. code-block:: python

        import paddle
        import paddle.nn.functional as F
374

375
        paddle.disable_static()
376

377
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
378
        out = F.softplus(x) # [0.513015, 0.598139, 0.744397, 0.854355]
379 380 381 382 383 384 385 386 387

""")

add_sample_code(globals()["softsign"], r"""
Examples:
    .. code-block:: python

        import paddle
        import paddle.nn.functional as F
388

389
        paddle.disable_static()
390

391
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
392
        out = F.softsign(x) # [-0.285714, -0.166667, 0.0909091, 0.230769]
393 394 395

""")

396 397 398 399 400 401
__all__ += ['softshrink']

_softshrink_ = generate_layer_fn('softshrink')


def softshrink(x, alpha=None):
402 403 404
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'],
                             'softshrink')

405 406 407 408 409 410 411 412 413 414 415
    locals_var = locals().copy()
    kwargs = dict()
    for name, val in locals_var.items():
        if val is not None:
            if name == 'alpha':
                kwargs['lambda'] = val
            else:
                kwargs[name] = val
    return _softshrink_(**kwargs)


416
softshrink.__doc__ = r"""
417 418 419
	:alias_main: paddle.nn.functional.softshrink
	:alias: paddle.nn.functional.softshrink,paddle.nn.functional.activation.softshrink
	:old_api: paddle.fluid.layers.softshrink
S
swtkiwi 已提交
420

421 422 423
:strong:`Softshrink Activation Operator`

..  math::
424 425 426 427 428
    out = \\begin{cases}
            x - \\alpha, \\text{if } x > \\alpha \\\\
            x + \\alpha, \\text{if } x < -\\alpha \\\\
            0,  \\text{otherwise}
          \\end{cases}
429 430 431


Args:
432 433
    x: Input of Softshrink operator, an N-D Tensor, with data type float32, float64 or float16.
    alpha (float): non-negative offset
434 435
    
Returns:
436
    Output of Softshrink operator with the same type of input.
437 438 439 440 441

Examples:
    .. code-block:: python
    
        import paddle.fluid as fluid
442
        data = fluid.data(name="input", shape=[None, 784])
443 444 445
        result = fluid.layers.softshrink(x=data, alpha=0.3)
"""

Y
yuyang18 已提交
446 447 448 449 450
__all__ += ['hard_shrink']

_hard_shrink_ = generate_layer_fn('hard_shrink')


451
@deprecated(since="2.0.0", update_to="paddle.nn.functional.hardshrink")
Y
yuyang18 已提交
452
def hard_shrink(x, threshold=None):
453 454 455
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'],
                             'hard_shrink')

456
    locals_var = locals().copy()
Y
yuyang18 已提交
457
    kwargs = dict()
458
    for name, val in locals_var.items():
Y
yuyang18 已提交
459 460 461 462 463
        if val is not None:
            kwargs[name] = val
    return _hard_shrink_(**kwargs)


Y
yuyang18 已提交
464
hard_shrink.__doc__ = _hard_shrink_.__doc__ + """
Y
yuyang18 已提交
465 466
Examples:

467
    >>> import paddle.fluid as fluid
Y
yuyang18 已提交
468 469 470
    >>> data = fluid.layers.data(name="input", shape=[784])
    >>> result = fluid.layers.hard_shrink(x=data, threshold=0.3)
"""
Y
yuyang18 已提交
471

W
wopeizl 已提交
472 473 474 475 476
__all__ += ['cumsum']

_cum_sum_ = generate_layer_fn('cumsum')


477 478 479 480
@deprecated(
    since="2.0.0",
    update_to="paddle.cumsum",
    reason="New APIs for Paddle 2.0 are coming.")
W
wopeizl 已提交
481
def cumsum(x, axis=None, exclusive=None, reverse=None):
482
    check_type(x, 'x', (Variable), 'cumsum')
483
    locals_var = locals().copy()
W
wopeizl 已提交
484
    kwargs = dict()
485
    for name, val in locals_var.items():
W
wopeizl 已提交
486 487 488 489 490
        if val is not None:
            kwargs[name] = val
    return _cum_sum_(**kwargs)


L
liu zhengxi 已提交
491
cumsum.__doc__ = """
492 493 494
	:alias_main: paddle.cumsum
	:alias: paddle.cumsum,paddle.tensor.cumsum,paddle.tensor.math.cumsum
	:old_api: paddle.fluid.layers.cumsum
S
swtkiwi 已提交
495

L
liu zhengxi 已提交
496
The cumulative sum of the elements along a given axis. By default, the first element of the result is the same of the first element of the input. If exlusive is true, the first element of the result is 0.
W
wopeizl 已提交
497

L
liu zhengxi 已提交
498 499
Args:
    x (Variable): Input of cumsum operator, the Tensor/LoDTensor needed to be cumsumed. 
T
tianshuo78520a 已提交
500
    axis (int, optional): The dimension to accumulate along. -1 means the last dimension. Default is -1.
L
liu zhengxi 已提交
501 502 503 504 505 506 507 508 509 510 511 512
    exclusive (bool, optional): Whether to perform exclusive cumsum. Default is False.
    reverse (bool, optional): If true, the cumsum is performed in the reversed direction. Default is False.

Returns:
    Variable(Tensor/LoDTensor): The result of cumsum operator, output of cumsum operator. 

Examples:
    .. code-block:: python
        
        import paddle.fluid as fluid
        data = fluid.layers.data(name="input", shape=[32, 784])
        result = fluid.layers.cumsum(data, axis=0)
W
wopeizl 已提交
513
"""
Y
yuyang18 已提交
514 515 516 517 518 519 520

__all__ += ['thresholded_relu']

_thresholded_relu_ = generate_layer_fn('thresholded_relu')


def thresholded_relu(x, threshold=None):
521 522 523
    check_variable_and_dtype(x, 'x', ['float16', 'float32', 'float64'],
                             'thresholded_relu')

524
    locals_var = locals().copy()
Y
yuyang18 已提交
525
    kwargs = dict()
526
    for name, val in locals_var.items():
Y
yuyang18 已提交
527 528 529
        if val is not None:
            kwargs[name] = val

C
chengduo 已提交
530
    return _thresholded_relu_(**kwargs)
Y
yuyang18 已提交
531 532


533
thresholded_relu.__doc__ = r"""
534 535 536
	:alias_main: paddle.nn.functional.thresholded_relu
	:alias: paddle.nn.functional.thresholded_relu,paddle.nn.functional.activation.thresholded_relu
	:old_api: paddle.fluid.layers.thresholded_relu
S
swtkiwi 已提交
537

538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
:strong:`Thresholded ReLU Activation Operator`

Equation:
    ..  math::
        out = \\begin{cases}
            x, &if x > threshold \\\\
            0, &otherwise
            \\end{cases}

Args:
    x(Variable): The input of Thresholded ReLU op, Tensor or LoDTensor, dtype: float32 or float64.
        
    threshold(float, optional): The threshold value. Note that if the arg `threshold` is not set, the threshold in the equation is 1.0.

Returns:

    Variable: The output of Thresholded ReLU op, Tensor or LoDTensor, dtype: float32 or float64, the same as the input, shape: the same as the input.

Y
yuyang18 已提交
556
Examples:
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
    
    .. code-block:: python
    
        # declarative mode
        import numpy as np
        from paddle import fluid
        
        x = fluid.data(name="x", shape=(-1, 3), dtype="float32")
        y = fluid.layers.thresholded_relu(x, threshold=0.1)
        
        place = fluid.CPUPlace()
        exe = fluid.Executor(place)
        start = fluid.default_startup_program()
        main = fluid.default_main_program()
        
        data = np.random.randn(2, 3).astype("float32")
        exe.run(start)
        
        y_np, = exe.run(main, feed={"x": data}, fetch_list=[y])
        
        data
        # array([[ 0.21134382, -1.1805999 ,  0.32876605],
        #        [-1.2210793 , -0.7365624 ,  1.0013918 ]], dtype=float32)
        y_np
        # array([[ 0.21134382, -0.        ,  0.32876605],
        #        [-0.        , -0.        ,  1.0013918 ]], dtype=float32)
Y
yuyang18 已提交
583

584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
    .. code-block:: python
    
        # imperative mode
        import numpy as np
        from paddle import fluid
        import paddle.fluid.dygraph as dg
        
        data = np.random.randn(2, 3).astype("float32")
        place = fluid.CPUPlace()
        with dg.guard(place) as g:
            x = dg.to_variable(data)
            y = fluid.layers.thresholded_relu(x, threshold=0.1)
            y_np = y.numpy()
        data
        # array([[ 0.21134382, -1.1805999 ,  0.32876605],
        #        [-1.2210793 , -0.7365624 ,  1.0013918 ]], dtype=float32)
        y_np
        # array([[ 0.21134382, -0.        ,  0.32876605],
        #        [-0.        , -0.        ,  1.0013918 ]], dtype=float32)
Y
yuyang18 已提交
603
"""
F
Feiyu Chan 已提交
604 605 606 607 608 609

__all__ += ['gelu']

_gelu_ = generate_layer_fn('gelu')


610
@deprecated(since="2.0.0", update_to="paddle.nn.functional.gelu")
611
def gelu(x, approximate=False):
F
Feiyu Chan 已提交
612 613 614 615 616 617 618 619
    locals_var = locals().copy()
    kwargs = dict()
    for name, val in locals_var.items():
        if val is not None:
            kwargs[name] = val
    return _gelu_(**kwargs)


620
gelu.__doc__ = r"""
F
Feiyu Chan 已提交
621 622 623 624
:strong:`GeLU Activation Operator`
For more details, see [Gaussian Error Linear Units](https://arxiv.org/abs/1606.08415).

Equation:
625 626 627 628 629
    if approximate is True
    ..  math::
        out = 0.5 * x * (1 + tanh(\\sqrt{\\frac{2}{\\pi}} * (x + 0.044715x^{3})))

    else
F
Feiyu Chan 已提交
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
    ..  math::
        out = 0.5 * x * (1 + erf(\\frac{x}{\\sqrt{2}}))

Args:

    x(Variable): The input of GeLU op, Tensor or LoDTensor, dtype: float32 or float64.

Returns:

    Variable: The output of GeLU op, Tensor or LoDTensor, dtype: float32 or float64, the same as the input, shape: the same as the input.

Examples:
    
    .. code-block:: python
    
        # declarative mode
        import numpy as np
        from paddle import fluid
        
        x = fluid.data(name="x", shape=(-1, 3), dtype="float32")
        y = fluid.layers.gelu(x)
        
        place = fluid.CPUPlace()
        exe = fluid.Executor(place)
        start = fluid.default_startup_program()
        main = fluid.default_main_program()
        
        data = np.random.randn(2, 3).astype("float32")
        exe.run(start)
        
        y_np, = exe.run(main, feed={"x": data}, fetch_list=[y])
        
        data
        # array([[ 0.87165993, -1.0541513 , -0.37214822],
        #         [ 0.15647964,  0.32496083,  0.33045998]], dtype=float32)
        y_np
        # array([[ 0.70456535, -0.15380788, -0.13207214],
        #        [ 0.08796856,  0.20387867,  0.2080159 ]], dtype=float32)

    .. code-block:: python
    
        # imperative mode
        import numpy as np
        from paddle import fluid
        import paddle.fluid.dygraph as dg
        
        data = np.random.randn(2, 3).astype("float32")
        place = fluid.CPUPlace()
        with dg.guard(place) as g:
            x = dg.to_variable(data)
            y = fluid.layers.gelu(x)
            y_np = y.numpy()
        data
        # array([[ 0.87165993, -1.0541513 , -0.37214822],
        #        [ 0.15647964,  0.32496083,  0.33045998]], dtype=float32)
        y_np
        # array([[ 0.70456535, -0.15380788, -0.13207214],
        #        [ 0.08796856,  0.20387867,  0.2080159 ]], dtype=float32)
"""
F
Feiyu Chan 已提交
689 690 691 692 693 694

__all__ += ['erf']

_erf_ = generate_layer_fn('erf')


W
WuHaobo 已提交
695
def erf(x, name=None):
F
Feiyu Chan 已提交
696 697 698 699 700 701 702 703
    locals_var = locals().copy()
    kwargs = dict()
    for name, val in locals_var.items():
        if val is not None:
            kwargs[name] = val
    return _erf_(**kwargs)


704
erf.__doc__ = r"""
F
Feiyu Chan 已提交
705 706 707 708 709 710 711 712 713
:strong:`Erf Operator`
For more details, see [Error function](https://en.wikipedia.org/wiki/Error_function).

Equation:
    ..  math::
        out = \\frac{2}{\\sqrt{\\pi}} \\int_{0}^{x}e^{- \\eta^{2}}d\\eta

Args:

W
WuHaobo 已提交
714
    x (Tensor): The input tensor, it's data type should be float32, float64.
F
Feiyu Chan 已提交
715 716 717

Returns:

W
WuHaobo 已提交
718
    Tensor: The output of Erf op, dtype: float32 or float64, the same as the input, shape: the same as the input.
F
Feiyu Chan 已提交
719 720 721 722 723

Examples:
    
    .. code-block:: python
    
W
WuHaobo 已提交
724 725
        import paddle
        paddle.disable_static()
726
        x = paddle.to_tensor([-0.4, -0.2, 0.1, 0.3])
W
WuHaobo 已提交
727 728 729
        out = paddle.erf(x)
        print(out.numpy())
        # [-0.42839236 -0.22270259  0.11246292  0.32862676]
F
Feiyu Chan 已提交
730
"""