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

15 16
from __future__ import print_function

Q
qijun 已提交
17 18
import unittest
import numpy as np
K
Kexin Zhao 已提交
19
import paddle.fluid.core as core
Q
qijun 已提交
20
from op_test import OpTest
C
Clementine 已提交
21
from scipy.special import expit, erf
22
import paddle
23
import paddle.fluid as fluid
24
import paddle.nn as nn
25
import paddle.nn.functional as F
26
from paddle.fluid import compiler, Program, program_guard
Q
qijun 已提交
27

28 29
paddle.enable_static()

Q
qijun 已提交
30

31
class TestSqrtOpError(unittest.TestCase):
Z
Zhaolong Xing 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
    def test_errors(self):
        with program_guard(Program(), Program()):
            # The input type of sqrt op must be Variable or numpy.ndarray.
            in1 = 1
            self.assertRaises(TypeError, fluid.layers.sqrt, in1)
            # The input dtype of sqrt op must be float16, float32, float64.
            in2 = fluid.layers.data(
                name='input2', shape=[12, 10], dtype="int32")
            self.assertRaises(TypeError, fluid.layers.sqrt, in2)

            in3 = fluid.layers.data(
                name='input3', shape=[12, 10], dtype="float16")
            fluid.layers.sqrt(x=in3)


C
chengduo 已提交
47
class TestActivation(OpTest):
Q
qijun 已提交
48 49
    def setUp(self):
        self.op_type = "exp"
50
        self.init_dtype()
51
        self.init_kernel_type()
52

53
        np.random.seed(2049)
54 55 56 57 58
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.exp(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
Q
qijun 已提交
59 60 61 62 63

    def test_check_output(self):
        self.check_output()

    def test_check_grad(self):
64 65
        if self.dtype == np.float16:
            return
66
        self.check_grad(['X'], 'Out')
Q
qijun 已提交
67

68
    def init_dtype(self):
69
        self.dtype = np.float64
70

71 72 73
    def init_kernel_type(self):
        pass

Q
qijun 已提交
74

75 76 77
class TestParameter(object):
    def test_out_name(self):
        with fluid.program_guard(fluid.Program()):
W
WuHaobo 已提交
78
            np_x = np.array([0.1])
79
            data = fluid.layers.data(name="X", shape=[1])
W
WuHaobo 已提交
80
            out = eval("paddle.%s(data, name='Y')" % self.op_type)
81 82
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
W
WuHaobo 已提交
83 84 85
            result, = exe.run(feed={"X": np_x}, fetch_list=[out])
            expected = eval("np.%s(np_x)" % self.op_type)
            self.assertEqual(result, expected)
86 87 88 89 90 91 92 93 94 95

    def test_dygraph(self):
        with fluid.dygraph.guard():
            np_x = np.array([0.1])
            x = fluid.dygraph.to_variable(np_x)
            z = eval("paddle.%s(x).numpy()" % self.op_type)
            z_expected = eval("np.%s(np_x)" % self.op_type)
            self.assertEqual(z, z_expected)


C
chengduo 已提交
96
class TestSigmoid(TestActivation):
Q
qijun 已提交
97 98
    def setUp(self):
        self.op_type = "sigmoid"
99 100
        self.init_dtype()

101
        np.random.seed(1024)
102 103 104 105 106
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
        out = 1 / (1 + np.exp(-x))

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
Q
qijun 已提交
107

108 109 110
    def init_dtype(self):
        self.dtype = np.float32

111
    def test_check_grad(self):
112 113 114 115
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out', max_relative_error=0.01)

116

C
chengduo 已提交
117
class TestLogSigmoid(TestActivation):
118 119
    def setUp(self):
        self.op_type = "logsigmoid"
120 121
        self.init_dtype()

122
        np.random.seed(2048)
123 124 125
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
        out = np.log(1 / (1 + np.exp(-x)))

126
        self.inputs = {'X': x}
127
        self.outputs = {'Out': out}
128 129

    def test_check_grad(self):
130 131
        if self.dtype == np.float16:
            return
F
fengjiayi 已提交
132
        self.check_grad(['X'], 'Out', max_relative_error=0.008)
133 134


135
class TestLogSigmoidAPI(unittest.TestCase):
136
    # test paddle.nn.LogSigmoid, paddle.nn.functional.log_sigmoid
137
    def setUp(self):
138
        np.random.seed(1024)
139 140 141 142 143
        self.x_np = np.random.uniform(-1, 1, [11, 17]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
144
        paddle.enable_static()
145 146
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [11, 17])
147
            out1 = F.log_sigmoid(x)
148 149 150 151 152 153
            m = paddle.nn.LogSigmoid()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = np.log(1 / (1 + np.exp(-self.x_np)))
        for r in res:
154
            self.assertTrue(np.allclose(out_ref, r))
155 156 157 158

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
159
        out1 = F.log_sigmoid(x)
160 161 162 163
        m = paddle.nn.LogSigmoid()
        out2 = m(x)
        out_ref = np.log(1 / (1 + np.exp(-self.x_np)))
        for r in [out1, out2]:
164
            self.assertTrue(np.allclose(out_ref, r.numpy()))
165 166
        paddle.enable_static()

167
    def test_fluid_api(self):
168
        paddle.enable_static()
169 170 171 172 173 174 175 176
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [11, 17])
            out = paddle.fluid.layers.logsigmoid(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = np.log(1 / (1 + np.exp(-self.x_np)))
        self.assertTrue(np.allclose(out_ref, res[0]))

177
    def test_errors(self):
178
        paddle.enable_static()
179 180
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
181
            self.assertRaises(TypeError, F.log_sigmoid, 1)
182 183
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[11, 17], dtype='int32')
184
            self.assertRaises(TypeError, F.log_sigmoid, x_int32)
185 186
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[11, 17], dtype='float16')
187
            F.log_sigmoid(x_fp16)
188 189


190
class TestTanh(TestActivation, TestParameter):
191 192
    def setUp(self):
        self.op_type = "tanh"
193
        self.init_dtype()
194
        np.random.seed(1024)
195 196 197 198 199
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.tanh(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
200 201

    def test_check_grad(self):
202 203
        if self.dtype == np.float16:
            return
204
        self.check_grad(['X'], 'Out')
205

206 207 208 209 210 211
    def init_dtype(self):
        #TODO If dtype is float64, the output (Out) has diff at CPUPlace
        # when using and not using inplace. Therefore, set dtype as float32
        # for now.
        self.dtype = np.float32

212

W
WangXi 已提交
213 214 215 216
class TestTanhAPI(unittest.TestCase):
    # test paddle.tanh, paddle.nn.tanh, paddle.nn.functional.tanh
    def setUp(self):
        self.dtype = 'float32'
217
        np.random.seed(1024)
W
WangXi 已提交
218 219 220 221 222
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
        self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
223
        paddle.enable_static()
W
WangXi 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12], self.dtype)
            out1 = F.tanh(x)
            th = paddle.nn.Tanh()
            out2 = th(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = np.tanh(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
Z
Zhou Wei 已提交
237
        x = paddle.to_tensor(self.x_np)
W
WangXi 已提交
238 239 240 241 242 243 244 245 246 247
        out1 = F.tanh(x)
        out2 = paddle.tanh(x)
        th = paddle.nn.Tanh()
        out3 = th(x)
        out_ref = np.tanh(self.x_np)
        for r in [out1, out2, out3]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
248
        paddle.enable_static()
W
WangXi 已提交
249 250 251 252 253 254 255 256 257
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', [10, 12], self.dtype)
            out = fluid.layers.tanh(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = np.tanh(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

    def test_errors(self):
258
        paddle.enable_static()
W
WangXi 已提交
259 260 261 262 263 264 265 266 267 268 269
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.tanh, 1)
            # The input dtype must be float16, float32.
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.tanh, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.tanh(x_fp16)


270
class TestAtan(TestActivation, TestParameter):
271 272 273 274
    def setUp(self):
        self.op_type = "atan"
        self.init_dtype()

275
        np.random.seed(1024)
276 277 278 279 280 281 282 283 284
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.arctan(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
285
        self.check_grad(['X'], 'Out')
286

W
WuHaobo 已提交
287 288 289 290 291 292 293 294 295 296 297
    def test_out_name(self):
        with fluid.program_guard(fluid.Program()):
            np_x = np.array([0.1])
            data = fluid.layers.data(name="X", shape=[1])
            out = paddle.atan(data, name='Y')
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)
            result, = exe.run(feed={"X": np_x}, fetch_list=[out])
            expected = np.arctan(np_x)
            self.assertEqual(result, expected)

298 299 300 301 302 303 304 305
    def test_dygraph(self):
        with fluid.dygraph.guard():
            np_x = np.array([0.1])
            x = fluid.dygraph.to_variable(np_x)
            z = paddle.atan(x).numpy()
            z_expected = np.arctan(np_x)
            self.assertEqual(z, z_expected)

306

307 308 309 310 311
class TestSinh(TestActivation):
    def setUp(self):
        self.op_type = "sinh"
        self.init_dtype()

312
        np.random.seed(1024)
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.sinh(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out')

    def test_dygraph(self):
        with fluid.dygraph.guard():
            np_x = np.array([0.1])
            x = fluid.dygraph.to_variable(np_x)
            z = fluid.layers.sinh(x).numpy()
            z_expected = np.sinh(np_x)
            self.assertTrue(np.allclose(z, z_expected))

    def test_api(self):
        test_data_shape = [11, 17]
        with fluid.program_guard(fluid.Program(), fluid.Program()):
            input_x = np.random.uniform(0.1, 1,
                                        test_data_shape).astype("float32")
            data_x = fluid.layers.data(
                name="data_x",
                shape=test_data_shape,
                append_batch_size=False,
                dtype="float32")

            pd_sinh_out = fluid.layers.sinh(data_x)
            exe = fluid.Executor(place=fluid.CPUPlace())
            exe.run(fluid.default_startup_program())
            np_sinh_res = exe.run(fluid.default_main_program(),
                                  feed={"data_x": input_x},
                                  fetch_list=[pd_sinh_out])

        expected_res = np.sinh(input_x)
        self.assertTrue(np.allclose(np_sinh_res, expected_res))

    def test_backward(self):
        test_data_shape = [11, 17]
        with fluid.dygraph.guard():
            input_x = np.random.uniform(0.1, 1,
                                        test_data_shape).astype("float32")
            var = fluid.dygraph.to_variable(input_x)
            var.stop_gradient = False
            loss = fluid.layers.sinh(var)
            loss.backward()
            grad_var = var.gradient()
            self.assertEqual(grad_var.shape, input_x.shape)


class TestSinhOpError(unittest.TestCase):
    def test_errors(self):
        with program_guard(Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, fluid.layers.sinh, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = fluid.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, fluid.layers.sinh, x_int32)
            # support the input dtype is float16
            x_fp16 = fluid.data(name='x_fp16', shape=[12, 10], dtype='float16')
            fluid.layers.sinh(x_fp16)


class TestCosh(TestActivation):
    def setUp(self):
        self.op_type = "cosh"
        self.init_dtype()

384
        np.random.seed(1024)
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.cosh(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out')

    def test_dygraph(self):
        with fluid.dygraph.guard():
            np_x = np.array([0.1])
            x = fluid.dygraph.to_variable(np_x)
            z = fluid.layers.cosh(x).numpy()
            z_expected = np.cosh(np_x)
            self.assertTrue(np.allclose(z, z_expected))

    def test_api(self):
        test_data_shape = [11, 17]
        with fluid.program_guard(fluid.Program(), fluid.Program()):
            input_x = np.random.uniform(0.1, 1,
                                        test_data_shape).astype("float32")
            data_x = fluid.layers.data(
                name="data_x",
                shape=test_data_shape,
                append_batch_size=False,
                dtype="float32")

            pd_cosh_out = paddle.cosh(data_x)
            exe = fluid.Executor(place=fluid.CPUPlace())
            exe.run(fluid.default_startup_program())
            np_cosh_res = exe.run(fluid.default_main_program(),
                                  feed={"data_x": input_x},
                                  fetch_list=[pd_cosh_out])

        expected_res = np.cosh(input_x)
        self.assertTrue(np.allclose(np_cosh_res, expected_res))

    def test_backward(self):
        test_data_shape = [11, 17]
        with fluid.dygraph.guard():
            input_x = np.random.uniform(0.1, 1,
                                        test_data_shape).astype("float32")
            var = fluid.dygraph.to_variable(input_x)
            var.stop_gradient = False
            loss = fluid.layers.cosh(var)
            loss.backward()
            grad_var = var.gradient()
            self.assertEqual(grad_var.shape, input_x.shape)


class TestCoshOpError(unittest.TestCase):
    def test_errors(self):
        with program_guard(Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, fluid.layers.cosh, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = fluid.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, fluid.layers.cosh, x_int32)
            # support the input dtype is float16
            x_fp16 = fluid.data(name='x_fp16', shape=[12, 10], dtype='float16')
            fluid.layers.cosh(x_fp16)


451 452 453 454 455 456
def ref_tanhshrink(x):
    out = x - np.tanh(x)
    return out


class TestTanhshrink(TestActivation):
K
Kavya Srinet 已提交
457 458
    def setUp(self):
        self.op_type = "tanh_shrink"
459 460
        self.init_dtype()

461
        np.random.seed(1024)
462 463
        x = np.random.uniform(10, 20, [10, 17]).astype(self.dtype)
        out = ref_tanhshrink(x)
464

465
        self.inputs = {'X': x}
466
        self.outputs = {'Out': out}
K
Kavya Srinet 已提交
467 468

    def test_check_grad(self):
469 470
        if self.dtype == np.float16:
            return
471
        self.check_grad(['X'], 'Out')
K
Kavya Srinet 已提交
472

473

474 475 476
class TestTanhshrinkAPI(unittest.TestCase):
    # test paddle.nn.Tanhshrink, paddle.nn.functional.tanhshrink
    def setUp(self):
477
        np.random.seed(1024)
478 479 480 481 482
        self.x_np = np.random.uniform(10, 20, [10, 17]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
483
        paddle.enable_static()
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.tanhshrink(x)
            tanhshrink = paddle.nn.Tanhshrink()
            out2 = tanhshrink(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_tanhshrink(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.tanhshrink(x)
        tanhshrink = paddle.nn.Tanhshrink()
        out2 = tanhshrink(x)
        out_ref = ref_tanhshrink(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
507
        paddle.enable_static()
508 509 510 511 512 513 514 515 516
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.tanh_shrink(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_tanhshrink(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

    def test_errors(self):
517
        paddle.enable_static()
518 519 520 521 522 523 524 525 526 527 528
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.tanhshrink, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.tanhshrink, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.tanhshrink(x_fp16)


529 530 531 532 533 534
def ref_hardshrink(x, threshold):
    out = np.copy(x)
    out[(out >= -threshold) & (out <= threshold)] = 0
    return out


C
chengduo 已提交
535
class TestHardShrink(TestActivation):
536 537
    def setUp(self):
        self.op_type = "hard_shrink"
538 539
        self.init_dtype()

540 541
        self.threshold = 0.5
        self.set_attrs()
542
        np.random.seed(1024)
Z
zhupengyang 已提交
543
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype) * 10
544
        out = ref_hardshrink(x, self.threshold)
545

546
        self.attrs = {'threshold': self.threshold}
547
        self.inputs = {'X': x}
548
        self.outputs = {'Out': out}
549

550 551 552
    def set_attrs(self):
        pass

553
    def test_check_grad(self):
554 555
        if self.dtype == np.float16:
            return
556
        self.check_grad(['X'], 'Out')
557 558


559 560 561 562 563
class TestHardShrink_threshold_negative(TestHardShrink):
    def set_attrs(self):
        self.threshold = -0.1


564 565 566
class TestHardShrinkAPI(unittest.TestCase):
    # test paddle.nn.Hardshrink, paddle.nn.functional.hardshrink
    def setUp(self):
567
        np.random.seed(1024)
568 569 570 571 572
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
573
        paddle.enable_static()
574 575 576 577 578 579 580 581 582 583 584 585 586
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12])
            out1 = F.hardshrink(x)
            hd = paddle.nn.Hardshrink()
            out2 = hd(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_hardshrink(self.x_np, 0.5)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
Z
Zhou Wei 已提交
587
        x = paddle.to_tensor(self.x_np)
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
        out1 = F.hardshrink(x)
        hd = paddle.nn.Hardshrink()
        out2 = hd(x)
        out_ref = ref_hardshrink(self.x_np, 0.5)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)

        out1 = F.hardshrink(x, 0.6)
        hd = paddle.nn.Hardshrink(0.6)
        out2 = hd(x)
        out_ref = ref_hardshrink(self.x_np, 0.6)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
604
        paddle.enable_static()
605 606 607 608 609 610 611 612
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', [10, 12])
            out = fluid.layers.hard_shrink(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_hardshrink(self.x_np, 0.5)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

613
    def test_errors(self):
614
        paddle.enable_static()
615
        with paddle.static.program_guard(paddle.static.Program()):
616
            # The input type must be Variable.
617
            self.assertRaises(TypeError, F.hardshrink, 1)
618
            # The input dtype must be float16, float32, float64.
619 620
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.hardshrink, x_int32)
621
            # support the input dtype is float16
622 623
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.hardshrink(x_fp16)
624 625


626 627 628 629 630 631 632 633 634 635 636
def ref_hardtanh(x, min=-1.0, max=1.0):
    out = np.copy(x)
    out[np.abs(x - min) < 0.005] = min + 0.02
    out[np.abs(x - max) < 0.005] = max + 0.02
    out = np.minimum(np.maximum(x, min), max)
    return out


class TestHardtanhAPI(unittest.TestCase):
    # test paddle.nn.Hardtanh, paddle.nn.functional.hardtanh
    def setUp(self):
637
        np.random.seed(1024)
638 639 640 641 642
        self.x_np = np.random.uniform(-3, 3, [10, 12]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
643
        paddle.enable_static()
644 645 646 647 648 649 650 651 652 653 654 655 656
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12])
            out1 = F.hardtanh(x)
            m = paddle.nn.Hardtanh()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_hardtanh(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
Z
Zhou Wei 已提交
657
        x = paddle.to_tensor(self.x_np)
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
        out1 = F.hardtanh(x)
        m = paddle.nn.Hardtanh()
        out2 = m(x)
        out_ref = ref_hardtanh(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)

        out1 = F.hardtanh(x, -2.0, 2.0)
        m = paddle.nn.Hardtanh(-2.0, 2.0)
        out2 = m(x)
        out_ref = ref_hardtanh(self.x_np, -2.0, 2.0)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_errors(self):
674
        paddle.enable_static()
675 676 677 678 679 680 681 682 683 684 685
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.hardtanh, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.hardtanh, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.hardtanh(x_fp16)


686 687 688 689 690 691 692 693
def ref_softshrink(x, threshold=0.5):
    out = np.copy(x)
    out = (out < -threshold) * (out + threshold) + (out > threshold) * (
        out - threshold)
    return out


class TestSoftshrink(TestActivation):
694 695
    def setUp(self):
        self.op_type = "softshrink"
696 697
        self.init_dtype()

698
        threshold = 0.8
699

700
        np.random.seed(1023)
701 702 703 704
        x = np.random.uniform(0.25, 10, [10, 12]).astype(self.dtype)
        out = ref_softshrink(x, threshold)
        self.inputs = {'X': x}
        self.attrs = {"lambda": threshold}
705
        self.outputs = {'Out': out}
706 707

    def test_check_grad(self):
708 709
        if self.dtype == np.float16:
            return
710
        self.check_grad(['X'], 'Out')
711

712

713 714 715 716
class TestSoftshrinkAPI(unittest.TestCase):
    # test paddle.nn.Softshrink, paddle.nn.functional.softshrink
    def setUp(self):
        self.threshold = 0.8
717
        np.random.seed(1024)
718 719 720 721 722
        self.x_np = np.random.uniform(0.25, 10, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
723
        paddle.enable_static()
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.softshrink(x, self.threshold)
            softshrink = paddle.nn.Softshrink(self.threshold)
            out2 = softshrink(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_softshrink(self.x_np, self.threshold)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.softshrink(x, self.threshold)
        softshrink = paddle.nn.Softshrink(self.threshold)
        out2 = softshrink(x)
        out_ref = ref_softshrink(self.x_np, self.threshold)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
747
        paddle.enable_static()
748 749 750 751 752 753 754 755
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.softshrink(x, self.threshold)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_softshrink(self.x_np, self.threshold)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

756
    def test_errors(self):
757
        paddle.enable_static()
758
        with paddle.static.program_guard(paddle.static.Program()):
759
            # The input type must be Variable.
760
            self.assertRaises(TypeError, F.softshrink, 1)
761
            # The input dtype must be float16, float32, float64.
762 763
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.softshrink, x_int32)
764 765 766
            # The threshold must be no less than zero
            x_fp32 = paddle.data(name='x_fp32', shape=[12, 10], dtype='float32')
            self.assertRaises(ValueError, F.softshrink, x_fp32, -1.0)
767
            # support the input dtype is float16
768 769
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.softshrink(x_fp16)
770 771


772
class TestSqrt(TestActivation, TestParameter):
773 774
    def setUp(self):
        self.op_type = "sqrt"
775 776
        self.init_dtype()

777
        np.random.seed(1023)
778 779 780 781 782
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.sqrt(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
783 784

    def test_check_grad(self):
785 786
        if self.dtype == np.float16:
            return
787
        self.check_grad(['X'], 'Out')
788

789

Z
zhoukunsheng 已提交
790 791 792 793 794
class TestRsqrt(TestActivation):
    def setUp(self):
        self.op_type = "rsqrt"
        self.init_dtype()

795
        np.random.seed(1024)
Z
zhupengyang 已提交
796
        x = np.random.uniform(0.1, 1, [10, 12]).astype(self.dtype) * 10
Z
zhoukunsheng 已提交
797 798 799 800 801 802 803 804 805 806 807
        out = 1.0 / np.sqrt(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out', max_relative_error=0.0005)


C
chengduo 已提交
808
class TestAbs(TestActivation):
809 810
    def setUp(self):
        self.op_type = "abs"
811 812
        self.init_dtype()

813
        np.random.seed(1024)
814
        x = np.random.uniform(-1, 1, [4, 25]).astype(self.dtype)
C
chengduo 已提交
815
        # Because we set delta = 0.005 in calculating numeric gradient,
Q
qijun 已提交
816
        # if x is too small, such as 0.002, x_neg will be -0.003
C
chengduo 已提交
817
        # x_pos will be 0.007, so the numeric gradient is inaccurate.
Q
qijun 已提交
818 819
        # we should avoid this
        x[np.abs(x) < 0.005] = 0.02
820 821 822 823
        out = np.abs(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
824 825

    def test_check_grad(self):
826 827
        if self.dtype == np.float16:
            return
828
        self.check_grad(['X'], 'Out')
829

830

C
chengduo 已提交
831
class TestCeil(TestActivation):
D
dzhwinter 已提交
832 833
    def setUp(self):
        self.op_type = "ceil"
834 835
        self.init_dtype()

836
        np.random.seed(1024)
Z
zhupengyang 已提交
837
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
838 839 840 841
        out = np.ceil(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
D
dzhwinter 已提交
842

D
dzhwinter 已提交
843
    # The same reason with TestFloor
C
chengduo 已提交
844
    def test_check_grad(self):
845 846 847
        pass


C
chengduo 已提交
848
class TestFloor(TestActivation):
D
dzhwinter 已提交
849 850
    def setUp(self):
        self.op_type = "floor"
851 852
        self.init_dtype()

853
        np.random.seed(1024)
Z
zhupengyang 已提交
854
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
855 856 857 858
        out = np.floor(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
D
dzhwinter 已提交
859

D
dzhwinter 已提交
860
    # the gradient on floor, ceil, round is undefined.
861
    # we return zero as gradient, but the numpy return nan
C
chengduo 已提交
862 863
    # The same reason with TestFloor
    def test_check_grad(self):
864 865 866
        pass


C
chengduo 已提交
867
class TestCos(TestActivation):
C
add cos  
chengduoZH 已提交
868 869
    def setUp(self):
        self.op_type = "cos"
870 871
        self.init_dtype()

872
        np.random.seed(1024)
Z
zhupengyang 已提交
873
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
874 875 876 877
        out = np.cos(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
C
add sin  
chengduoZH 已提交
878 879

    def test_check_grad(self):
880 881
        if self.dtype == np.float16:
            return
882
        self.check_grad(['X'], 'Out')
C
add sin  
chengduoZH 已提交
883

884

885 886 887 888 889
class TestAcos(TestActivation):
    def setUp(self):
        self.op_type = "acos"
        self.init_dtype()

890
        np.random.seed(1024)
Z
zhupengyang 已提交
891
        x = np.random.uniform(-0.95, 0.95, [10, 12]).astype(self.dtype)
892 893 894 895 896 897 898 899
        out = np.arccos(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
900
        self.check_grad(['X'], 'Out')
901 902


903
class TestSin(TestActivation, TestParameter):
C
add sin  
chengduoZH 已提交
904 905
    def setUp(self):
        self.op_type = "sin"
906 907
        self.init_dtype()

908
        np.random.seed(1024)
Z
zhupengyang 已提交
909
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
910 911 912 913
        out = np.sin(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
C
add cos  
chengduoZH 已提交
914 915

    def test_check_grad(self):
916 917
        if self.dtype == np.float16:
            return
918
        self.check_grad(['X'], 'Out')
C
add cos  
chengduoZH 已提交
919 920


921 922 923 924 925
class TestAsin(TestActivation):
    def setUp(self):
        self.op_type = "asin"
        self.init_dtype()

926
        np.random.seed(2048)
Z
zhupengyang 已提交
927
        x = np.random.uniform(-0.95, 0.95, [10, 12]).astype(self.dtype)
928 929 930 931 932 933 934 935
        out = np.arcsin(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
936
        self.check_grad(['X'], 'Out')
937 938


C
chengduo 已提交
939
class TestRound(TestActivation):
D
dzhwinter 已提交
940 941
    def setUp(self):
        self.op_type = "round"
942 943
        self.init_dtype()

944
        np.random.seed(1024)
Z
zhupengyang 已提交
945
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
946 947 948 949
        out = np.round(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
D
dzhwinter 已提交
950

C
chengduo 已提交
951
    def test_check_grad(self):
952 953 954
        pass


C
chengduo 已提交
955
class TestRelu(TestActivation):
956
    def setUp(self):
Q
qijun 已提交
957
        self.op_type = "relu"
K
Kexin Zhao 已提交
958 959
        self.init_dtype()

960
        np.random.seed(1024)
K
Kexin Zhao 已提交
961
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
Q
qijun 已提交
962 963
        # The same reason with TestAbs
        x[np.abs(x) < 0.005] = 0.02
K
Kexin Zhao 已提交
964 965
        out = np.maximum(x, 0)

966
        self.inputs = {'X': x}
K
Kexin Zhao 已提交
967
        self.outputs = {'Out': out}
968 969

    def test_check_grad(self):
K
Kexin Zhao 已提交
970 971
        if self.dtype == np.float16:
            return
972
        self.check_grad(['X'], 'Out')
A
Adam 已提交
973 974


975 976 977
class TestReluAPI(unittest.TestCase):
    # test paddle.nn.ReLU, paddle.nn.functional.relu
    def setUp(self):
978
        np.random.seed(1024)
979 980 981 982 983
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
984
        paddle.enable_static()
985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12])
            out1 = F.relu(x)
            m = paddle.nn.ReLU()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = np.maximum(self.x_np, 0)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.relu(x)
        m = paddle.nn.ReLU()
        out2 = m(x)
        out_ref = np.maximum(self.x_np, 0)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

1007
    def test_errors(self):
1008
        paddle.enable_static()
1009
        with paddle.static.program_guard(paddle.static.Program()):
1010
            # The input type must be Variable.
1011
            self.assertRaises(TypeError, F.relu, 1)
1012
            # The input dtype must be float16, float32, float64.
1013 1014
            x_int32 = paddle.data(name='x_int32', shape=[10, 12], dtype='int32')
            self.assertRaises(TypeError, F.relu, x_int32)
1015
            # support the input dtype is float16
1016 1017
            x_fp16 = paddle.data(name='x_fp16', shape=[10, 12], dtype='float16')
            F.relu(x_fp16)
1018 1019


1020 1021 1022 1023 1024 1025
def ref_leaky_relu(x, alpha=0.01):
    out = np.copy(x)
    out[out < 0] *= alpha
    return out


A
Adam 已提交
1026
class TestLeakyRelu(TestActivation):
1027 1028 1029
    def get_alpha(self):
        return 0.02

A
Adam 已提交
1030 1031 1032
    def setUp(self):
        self.op_type = "leaky_relu"
        self.init_dtype()
1033
        alpha = self.get_alpha()
A
Adam 已提交
1034

1035
        np.random.seed(1024)
A
Adam 已提交
1036 1037
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
        # The same reason with TestAbs
1038 1039
        x[np.abs(x) < 0.005] = 0.05
        out = ref_leaky_relu(x, alpha)
A
Adam 已提交
1040

1041
        self.inputs = {'X': x}
A
Adam 已提交
1042
        self.outputs = {'Out': out}
1043
        self.attrs = {'alpha': alpha}
A
Adam 已提交
1044 1045 1046 1047

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
1048
        self.check_grad(['X'], 'Out')
1049 1050


1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
class TestLeakyReluAlpha1(TestLeakyRelu):
    def get_alpha(self):
        return 2


class TestLeakyReluAlpha2(TestLeakyRelu):
    def get_alpha(self):
        return -0.01


class TestLeakyReluAlpha3(TestLeakyRelu):
    def get_alpha(self):
        return -2.0


class TestLeakyReluAPI(unittest.TestCase):
    # test paddle.nn.LeakyReLU, paddle.nn.functional.leaky_relu,
    # fluid.layers.leaky_relu
    def setUp(self):
1070
        np.random.seed(1024)
1071 1072 1073 1074 1075
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1076
        paddle.enable_static()
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12])
            out1 = F.leaky_relu(x)
            m = paddle.nn.LeakyReLU()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_leaky_relu(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
Z
Zhou Wei 已提交
1090
        x = paddle.to_tensor(self.x_np)
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
        out1 = F.leaky_relu(x)
        m = paddle.nn.LeakyReLU()
        out2 = m(x)
        out_ref = ref_leaky_relu(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)

        out1 = F.leaky_relu(x, 0.6)
        m = paddle.nn.LeakyReLU(0.6)
        out2 = m(x)
        out_ref = ref_leaky_relu(self.x_np, 0.6)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
1107
        paddle.enable_static()
1108 1109 1110 1111 1112 1113 1114 1115
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', [10, 12])
            out = fluid.layers.leaky_relu(x, 0.01)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_leaky_relu(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

1116
    def test_errors(self):
1117
        paddle.enable_static()
1118
        with paddle.static.program_guard(paddle.static.Program()):
1119
            # The input type must be Variable.
1120
            self.assertRaises(TypeError, F.leaky_relu, 1)
1121
            # The input dtype must be float16, float32, float64.
1122 1123 1124 1125 1126
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.leaky_relu, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.leaky_relu(x_fp16)
1127 1128


1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
def gelu(x, approximate):
    if approximate:
        y_ref = 0.5 * x * (1.0 + np.tanh(
            np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3))))
    else:
        y_ref = 0.5 * x * (1 + erf(x / np.sqrt(2)))
    return y_ref.astype(x.dtype)


class TestGeluApproximate(TestActivation):
C
Clementine 已提交
1139 1140 1141
    def setUp(self):
        self.op_type = "gelu"
        self.init_dtype()
1142
        approximate = True
1143
        np.random.seed(1024)
1144 1145
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
        out = gelu(x, approximate)
C
Clementine 已提交
1146

1147
        self.inputs = {'X': x}
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
        self.outputs = {'Out': out}
        self.attrs = {"approximate": approximate}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out')


class TestGelu(TestActivation):
    def setUp(self):
        self.op_type = "gelu"
        self.init_dtype()
        approximate = False
1162
        np.random.seed(2048)
C
Clementine 已提交
1163
        x = np.random.uniform(-1, 1, [11, 17]).astype(self.dtype)
1164
        out = gelu(x, approximate)
C
Clementine 已提交
1165

1166
        self.inputs = {'X': x}
C
Clementine 已提交
1167
        self.outputs = {'Out': out}
1168
        self.attrs = {"approximate": approximate}
C
Clementine 已提交
1169 1170 1171 1172

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
1173
        self.check_grad(['X'], 'Out')
C
Clementine 已提交
1174 1175


1176 1177 1178
class TestGELUAPI(unittest.TestCase):
    # test paddle.nn.GELU, paddle.nn.functional.gelu
    def setUp(self):
1179
        np.random.seed(1024)
1180 1181 1182 1183 1184
        self.x_np = np.random.uniform(-1, 1, [11, 17]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1185
        paddle.enable_static()
1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [11, 17])
            out1 = F.gelu(x)
            m = paddle.nn.GELU()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = gelu(self.x_np, False)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.gelu(x)
        m = paddle.nn.GELU()
        out2 = m(x)
        out_ref = gelu(self.x_np, False)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)

        out1 = F.gelu(x, True)
        m = paddle.nn.GELU(True)
        out2 = m(x)
        out_ref = gelu(self.x_np, True)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_errors(self):
1216
        paddle.enable_static()
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.gelu, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[11, 17], dtype='int32')
            self.assertRaises(TypeError, F.gelu, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[11, 17], dtype='float16')
            F.gelu(x_fp16)


C
chengduo 已提交
1228
class TestBRelu(TestActivation):
1229 1230
    def setUp(self):
        self.op_type = "brelu"
1231 1232
        self.init_dtype()

1233
        np.random.seed(1024)
Z
zhupengyang 已提交
1234
        x = np.random.uniform(-5, 10, [10, 12]).astype(self.dtype)
Y
Yang Yang(Tony) 已提交
1235 1236
        t_min = 1.0
        t_max = 4.0
Q
qijun 已提交
1237 1238
        # The same with TestAbs
        x[np.abs(x - t_min) < 0.005] = t_min + 0.02
Q
qijun 已提交
1239
        x[np.abs(x - t_max) < 0.005] = t_max + 0.02
1240 1241 1242
        t = np.copy(x)
        t[t < t_min] = t_min
        t[t > t_max] = t_max
1243 1244 1245

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.attrs = {'t_min': t_min, 't_max': t_max}
F
fengjiayi 已提交
1246
        self.outputs = {'Out': t}
1247 1248

    def test_check_grad(self):
1249 1250
        if self.dtype == np.float16:
            return
1251
        self.check_grad(['X'], 'Out')
1252

1253

1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
class TestBreluAPI(unittest.TestCase):
    # test paddle.fluid.layers.brelu
    def setUp(self):
        np.random.seed(1024)
        self.t_min = 0.
        self.t_max = 24.
        self.x_np = np.random.uniform(-1, 30, [10, 12]).astype('float32')
        self.out_ref = np.copy(self.x_np)
        self.out_ref[self.out_ref < self.t_min] = self.t_min
        self.out_ref[self.out_ref > self.t_max] = self.t_max
        self.out_ref = self.out_ref.astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_fluid_api(self):
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.static.data('X', [10, 12])
            out = paddle.fluid.layers.brelu(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
            self.assertTrue(np.allclose(self.out_ref, res[0]))

            paddle.disable_static(self.place)
            x = paddle.to_tensor(self.x_np)
            out = paddle.fluid.layers.brelu(x)
            self.assertTrue(np.allclose(self.out_ref, out.numpy()))
            paddle.enable_static()

1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294
    def test_errors(self):
        with program_guard(Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, fluid.layers.brelu, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = fluid.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, fluid.layers.brelu, x_int32)
            # support the input dtype is float16
            x_fp16 = fluid.layers.data(
                name='x_fp16', shape=[12, 10], dtype='float16')
            fluid.layers.brelu(x_fp16)


1295 1296 1297 1298 1299 1300 1301
def ref_relu6(x, threshold=6.0):
    out = np.copy(x)
    out[np.abs(x - threshold) < 0.005] = threshold + 0.02
    out = np.minimum(np.maximum(x, 0), threshold)
    return out


C
chengduo 已提交
1302
class TestRelu6(TestActivation):
K
Kavya Srinet 已提交
1303
    def setUp(self):
1304
        self.op_type = "relu6"
1305 1306
        self.init_dtype()

1307
        np.random.seed(1024)
Z
zhupengyang 已提交
1308
        x = np.random.uniform(-1, 10, [10, 12]).astype(self.dtype)
1309
        x[np.abs(x) < 0.005] = 0.02
1310
        out = ref_relu6(x)
1311

1312 1313
        self.inputs = {'X': x}
        self.attrs = {'threshold': 6.0}
1314
        self.outputs = {'Out': out}
K
Kavya Srinet 已提交
1315

1316 1317 1318
    def test_check_grad(self):
        if self.dtype == np.float16:
            return
1319
        self.check_grad(['X'], 'Out')
1320 1321


1322 1323 1324
class TestRelu6API(unittest.TestCase):
    # test paddle.nn.ReLU6, paddle.nn.functional.relu6
    def setUp(self):
1325
        np.random.seed(1024)
1326 1327 1328 1329 1330 1331
        self.x_np = np.random.uniform(-1, 10, [10, 12]).astype(np.float64)
        self.x_np[np.abs(self.x_np) < 0.005] = 0.02
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1332
        paddle.enable_static()
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.relu6(x)
            relu6 = paddle.nn.ReLU6()
            out2 = relu6(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_relu6(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.relu6(x)
        relu6 = paddle.nn.ReLU6()
        out2 = relu6(x)
        out_ref = ref_relu6(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
1356
        paddle.enable_static()
1357 1358 1359 1360 1361 1362 1363 1364
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.relu6(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_relu6(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

1365
    def test_errors(self):
1366
        paddle.enable_static()
1367
        with paddle.static.program_guard(paddle.static.Program()):
1368
            # The input type must be Variable.
1369
            self.assertRaises(TypeError, F.relu6, 1)
1370
            # The input dtype must be float16, float32, float64.
1371 1372
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.relu6, x_int32)
1373
            # support the input dtype is float16
1374 1375
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.relu6(x_fp16)
1376 1377


1378 1379 1380 1381 1382
def ref_hardswish(x, threshold=6.0, scale=6.0, offset=3.0):
    return (x * np.minimum(np.maximum(x + offset, 0.), threshold) /
            scale).astype(x.dtype)


H
huangjun12 已提交
1383 1384 1385 1386 1387
class TestHardSwish(TestActivation):
    def setUp(self):
        self.op_type = 'hard_swish'
        self.init_dtype()

1388
        np.random.seed(1024)
Z
zhupengyang 已提交
1389
        x = np.random.uniform(-6, 6, [10, 12]).astype(self.dtype)
H
huangjun12 已提交
1390 1391 1392 1393 1394 1395
        threshold = 6.0
        scale = 6.0
        offset = 3.0
        #the same with TestAbs
        x[np.abs(x + offset) < 0.005] = 0.02
        x[np.abs(x - threshold + offset) < 0.005] = threshold - offset + 0.02
1396
        out = ref_hardswish(x, threshold, scale, offset)
H
huangjun12 已提交
1397

1398
        self.inputs = {'X': x}
H
huangjun12 已提交
1399 1400 1401 1402 1403 1404
        self.attrs = {'threshold': threshold, 'scale': scale, 'offset': offset}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
1405
        self.check_grad(['X'], 'Out')
H
huangjun12 已提交
1406 1407


1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
class TestHardswishAPI(unittest.TestCase):
    # test paddle.nn.Hardswish, paddle.nn.functional.hardswish
    def setUp(self):
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.hardswish(x)
            m = paddle.nn.Hardswish()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_hardswish(self.x_np)
        for r in res:
            self.assertTrue(np.allclose(out_ref, r))

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.hardswish(x)
        m = paddle.nn.Hardswish()
        out2 = m(x)
        out_ref = ref_hardswish(self.x_np)
        for r in [out1, out2]:
            self.assertTrue(np.allclose(out_ref, r.numpy()))
1436
        paddle.enable_static()
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454

    def test_fluid_api(self):
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.hard_swish(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_hardswish(self.x_np)
        self.assertTrue(np.allclose(out_ref, res[0]))

        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out = paddle.fluid.layers.hard_swish(x)
        self.assertTrue(np.allclose(out_ref, out.numpy()))
        paddle.enable_static()

    def test_errors(self):
        with paddle.static.program_guard(paddle.static.Program()):
1455
            # The input type must be Variable.
1456
            self.assertRaises(TypeError, F.hardswish, 1)
1457
            # The input dtype must be float16, float32, float64.
1458 1459
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.hardswish, x_int32)
1460
            # support the input dtype is float16
1461 1462
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.hardswish(x_fp16)
1463 1464


C
chengduo 已提交
1465
class TestSoftRelu(TestActivation):
1466 1467
    def setUp(self):
        self.op_type = "soft_relu"
1468 1469
        self.init_dtype()

1470
        np.random.seed(4096)
1471
        x = np.random.uniform(-3, 3, [4, 4]).astype(self.dtype)
Y
Yang Yang(Tony) 已提交
1472
        threshold = 2.0
Q
qijun 已提交
1473 1474
        # The same reason with TestAbs
        x[np.abs(x - threshold) < 0.005] = threshold + 0.02
Z
zhupengyang 已提交
1475
        x[np.abs(x + threshold) < 0.005] = -threshold - 0.02
1476 1477 1478
        t = np.copy(x)
        t[t < -threshold] = -threshold
        t[t > threshold] = threshold
1479 1480 1481 1482 1483
        out = np.log((np.exp(t) + 1))

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.attrs = {'threshold': threshold}
        self.outputs = {'Out': out}
1484 1485

    def test_check_grad(self):
1486 1487
        if self.dtype == np.float16:
            return
F
fengjiayi 已提交
1488
        self.check_grad(['X'], 'Out', max_relative_error=0.02)
1489

1490

1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
class TestSoftReluOpError(unittest.TestCase):
    def test_errors(self):
        with program_guard(Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, fluid.layers.soft_relu, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = fluid.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, fluid.layers.soft_relu, x_int32)
            # support the input dtype is float16
            x_fp16 = fluid.data(name='x_fp16', shape=[12, 10], dtype='float16')
            fluid.layers.soft_relu(x_fp16)


1504 1505 1506 1507 1508
def elu(x, alpha):
    out_ref = np.maximum(0, x) + np.minimum(0, alpha * (np.exp(x) - 1))
    return out_ref.astype(x.dtype)


C
chengduo 已提交
1509
class TestELU(TestActivation):
1510 1511
    def setUp(self):
        self.op_type = "elu"
1512 1513
        self.init_dtype()

1514
        np.random.seed(1024)
Z
zhupengyang 已提交
1515
        x = np.random.uniform(-3, 3, [10, 12]).astype(self.dtype)
1516
        alpha = 1.
1517
        out = elu(x, alpha)
1518 1519 1520 1521
        # Note: unlike other Relu extensions, point 0 on standard ELU function (i.e. alpha = 1)
        # is differentiable, so we can skip modifications like x[np.abs(x) < 0.005] = 0.02 here
        self.inputs = {'X': x}
        self.attrs = {'alpha': alpha}
1522
        self.outputs = {'Out': out}
1523 1524

    def test_check_grad(self):
1525 1526
        if self.dtype == np.float16:
            return
1527
        self.check_grad(['X'], 'Out')
1528 1529


1530 1531 1532
class TestELUAPI(unittest.TestCase):
    # test paddle.nn.ELU, paddle.nn.functional.elu
    def setUp(self):
1533
        np.random.seed(1024)
1534 1535 1536 1537 1538
        self.x_np = np.random.uniform(-3, 3, [10, 12]).astype('float32')
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1539
        paddle.enable_static()
1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', [10, 12])
            out1 = F.elu(x)
            m = paddle.nn.ELU()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = elu(self.x_np, 1.0)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.elu(x)
        m = paddle.nn.ELU()
        out2 = m(x)
        out_ref = elu(self.x_np, 1.0)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)

        out1 = F.elu(x, 0.2)
        m = paddle.nn.ELU(0.2)
        out2 = m(x)
        out_ref = elu(self.x_np, 0.2)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

1569
    def test_errors(self):
1570
        paddle.enable_static()
1571 1572 1573 1574 1575 1576 1577 1578 1579
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.elu, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[10, 12], dtype='int32')
            self.assertRaises(TypeError, F.elu, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[10, 12], dtype='float16')
            F.elu(x_fp16)
1580 1581


C
chengduo 已提交
1582
class TestReciprocal(TestActivation):
Q
qijun 已提交
1583 1584
    def setUp(self):
        self.op_type = "reciprocal"
1585 1586
        self.init_dtype()

1587
        np.random.seed(1024)
1588 1589 1590 1591 1592
        x = np.random.uniform(1, 2, [11, 17]).astype(self.dtype)
        out = np.reciprocal(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
Q
qijun 已提交
1593 1594

    def test_check_grad(self):
1595 1596
        if self.dtype == np.float16:
            return
F
fengjiayi 已提交
1597
        self.check_grad(['X'], 'Out', max_relative_error=0.01)
Q
qijun 已提交
1598 1599


C
chengduo 已提交
1600
class TestLog(TestActivation):
Q
qijun 已提交
1601 1602
    def setUp(self):
        self.op_type = "log"
1603 1604
        self.init_dtype()

1605
        np.random.seed(1024)
1606 1607 1608 1609 1610
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.log(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
Q
qijun 已提交
1611 1612

    def test_check_grad(self):
1613 1614
        if self.dtype == np.float16:
            return
1615
        self.check_grad(['X'], 'Out')
Q
qijun 已提交
1616

1617 1618 1619 1620 1621 1622 1623 1624 1625
    def test_error(self):
        in1 = fluid.layers.data(
            name="in1", shape=[11, 17], append_batch_size=False, dtype="int32")
        in2 = fluid.layers.data(
            name="in2", shape=[11, 17], append_batch_size=False, dtype="int64")

        self.assertRaises(TypeError, fluid.layers.log, in1)
        self.assertRaises(TypeError, fluid.layers.log, in2)

1626

1627 1628 1629 1630 1631
class TestLog1p(TestActivation):
    def setUp(self):
        self.op_type = "log1p"
        self.init_dtype()

1632
        np.random.seed(1024)
1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.log1p(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
        self.check_grad(['X'], 'Out')

    def test_api(self):
        with fluid.program_guard(fluid.Program(), fluid.Program()):
            input_x = np.random.uniform(0.1, 1, [11, 17]).astype("float64")
            data_x = fluid.layers.data(
                name="data_x",
                shape=[11, 17],
                append_batch_size=False,
                dtype="float64")

            out1 = paddle.log1p(data_x)
            exe = fluid.Executor(place=fluid.CPUPlace())
            exe.run(fluid.default_startup_program())
1656 1657 1658
            res1 = exe.run(fluid.default_main_program(),
                           feed={"data_x": input_x},
                           fetch_list=[out1])
1659
        expected_res = np.log1p(input_x)
1660
        self.assertTrue(np.allclose(res1, expected_res))
1661 1662 1663 1664 1665 1666 1667 1668

        # dygraph
        with fluid.dygraph.guard():
            np_x = np.random.uniform(0.1, 1, [11, 17]).astype("float64")
            data_x = fluid.dygraph.to_variable(np_x)
            z = paddle.log1p(data_x)
            np_z = z.numpy()
            z_expected = np.array(np.log1p(np_x))
1669
        self.assertTrue(np.allclose(np_z, z_expected))
1670 1671


C
chengduo 已提交
1672
class TestSquare(TestActivation):
Q
qijun 已提交
1673 1674
    def setUp(self):
        self.op_type = "square"
1675 1676
        self.init_dtype()

1677
        np.random.seed(1024)
1678 1679 1680 1681 1682
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
        out = np.square(x)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.outputs = {'Out': out}
Q
qijun 已提交
1683 1684

    def test_check_grad(self):
1685 1686
        if self.dtype == np.float16:
            return
F
fengjiayi 已提交
1687
        self.check_grad(['X'], 'Out', max_relative_error=0.007)
Q
qijun 已提交
1688

1689

C
chengduo 已提交
1690
class TestPow(TestActivation):
1691 1692
    def setUp(self):
        self.op_type = "pow"
1693 1694
        self.init_dtype()

1695
        np.random.seed(1024)
1696 1697 1698 1699
        x = np.random.uniform(1, 2, [11, 17]).astype(self.dtype)
        out = np.power(x, 3)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
Y
Yang Yang(Tony) 已提交
1700
        self.attrs = {'factor': 3.0}
1701
        self.outputs = {'Out': out}
1702 1703

    def test_check_grad(self):
1704 1705
        if self.dtype == np.float16:
            return
1706
        self.check_grad(['X'], 'Out')
1707

1708

1709 1710 1711 1712 1713
class TestPow_factor_tensor(TestActivation):
    def setUp(self):
        self.op_type = "pow"
        self.init_dtype()

1714
        np.random.seed(1024)
1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731
        x = np.random.uniform(1, 2, [11, 17]).astype(self.dtype)
        out = np.power(x, 3)

        self.inputs = {
            'X': OpTest.np_dtype_to_fluid_dtype(x),
            'FactorTensor': np.array([3.0]).astype("float32")
        }

        self.attrs = {}
        self.outputs = {'Out': out}

    def test_check_output(self):
        self.check_output()

    def test_check_grad(self):
        if self.dtype == np.float16:
            return
1732
        self.check_grad(['X'], 'Out')
1733 1734 1735 1736 1737

    def test_api(self):
        input = np.random.uniform(1, 2, [11, 17]).astype("float32")
        x = fluid.layers.data(
            name="x", shape=[11, 17], append_batch_size=False, dtype="float32")
1738 1739 1740 1741 1742
        res = fluid.layers.data(
            name="res",
            shape=[11, 17],
            append_batch_size=False,
            dtype="float32")
1743 1744 1745 1746 1747

        factor_1 = 2.0
        factor_2 = fluid.layers.fill_constant([1], "float32", 3.0)
        out_1 = fluid.layers.pow(x, factor=factor_1)
        out_2 = fluid.layers.pow(x, factor=factor_2)
1748 1749 1750
        out_4 = paddle.pow(x, factor_1, name='pow_res')
        out_6 = paddle.pow(x, factor_2)
        self.assertEqual(('pow_res' in out_4.name), True)
1751 1752

        exe = fluid.Executor(place=fluid.CPUPlace())
W
WuHaobo 已提交
1753
        res_1, res_2, res, res_6 = exe.run(
1754 1755
            fluid.default_main_program(),
            feed={"x": input},
W
WuHaobo 已提交
1756
            fetch_list=[out_1, out_2, res, out_6])
1757 1758 1759

        assert np.array_equal(res_1, np.power(input, 2))
        assert np.array_equal(res_2, np.power(input, 3))
1760
        assert np.array_equal(res_6, np.power(input, 3))
1761

1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784
    def test_error(self):
        in1 = fluid.layers.data(
            name="in1", shape=[11, 17], append_batch_size=False, dtype="int32")
        in2 = fluid.layers.data(
            name="in2", shape=[11, 17], append_batch_size=False, dtype="int64")
        in3 = fluid.layers.data(
            name="in3",
            shape=[11, 17],
            append_batch_size=False,
            dtype="float32")
        in4 = fluid.layers.data(
            name="in4",
            shape=[11, 17],
            append_batch_size=False,
            dtype="float64")

        factor_1 = fluid.layers.fill_constant([1], "float64", 3.0)

        self.assertRaises(TypeError, fluid.layers.pow, x=in1, factor=factor_1)
        self.assertRaises(TypeError, fluid.layers.pow, x=in2, factor=factor_1)
        self.assertRaises(TypeError, fluid.layers.pow, x=in3, factor=factor_1)
        self.assertRaises(TypeError, fluid.layers.pow, x=in4, factor=factor_1)

1785

C
chengduo 已提交
1786
class TestSTanh(TestActivation):
1787 1788
    def setUp(self):
        self.op_type = "stanh"
1789 1790
        self.init_dtype()

1791
        np.random.seed(1024)
1792
        x = np.random.uniform(0.1, 1, [11, 17]).astype(self.dtype)
1793 1794
        scale_a = 2.0 / 3.0
        scale_b = 1.7159
1795 1796 1797
        out = scale_b * np.tanh(x * scale_a)

        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
1798
        self.attrs = {'scale_a': scale_a, 'scale_b': scale_b}
1799
        self.outputs = {'Out': out}
1800

Q
qijun 已提交
1801
    def test_check_grad(self):
1802 1803
        if self.dtype == np.float16:
            return
1804
        self.check_grad(['X'], 'Out')
Q
qijun 已提交
1805

1806

1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
class TestSTanhOpError(unittest.TestCase):
    def test_errors(self):
        with program_guard(Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, fluid.layers.stanh, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = fluid.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, fluid.layers.stanh, x_int32)
            # support the input dtype is float16
            x_fp16 = fluid.data(name='x_fp16', shape=[12, 10], dtype='float16')
            fluid.layers.stanh(x_fp16)


1820 1821 1822 1823 1824 1825 1826
def ref_softplus(x, beta=1, threshold=20):
    x_beta = beta * x
    out = np.select([x_beta <= threshold, x_beta > threshold],
                    [np.log(1 + np.exp(x_beta)) / beta, x])
    return out


C
chengduo 已提交
1827
class TestSoftplus(TestActivation):
K
kexinzhao 已提交
1828 1829
    def setUp(self):
        self.op_type = "softplus"
1830 1831
        self.init_dtype()

1832 1833
        beta = 2
        threshold = 15
1834

1835
        np.random.seed(1024)
1836 1837 1838 1839
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
        out = ref_softplus(x, beta, threshold)
        self.inputs = {'X': x}
        self.attrs = {'beta': beta, "threshold": threshold}
1840
        self.outputs = {'Out': out}
K
kexinzhao 已提交
1841 1842

    def test_check_grad(self):
1843 1844
        if self.dtype == np.float16:
            return
1845
        self.check_grad(['X'], 'Out')
K
kexinzhao 已提交
1846

1847

1848 1849 1850 1851 1852
class TestSoftplusAPI(unittest.TestCase):
    # test paddle.nn.Softplus, paddle.nn.functional.softplus
    def setUp(self):
        self.beta = 2
        self.threshold = 15
1853
        np.random.seed(1024)
1854 1855 1856 1857 1858
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1859
        paddle.enable_static()
1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.softplus(x, self.beta, self.threshold)
            softplus = paddle.nn.Softplus(self.beta, self.threshold)
            out2 = softplus(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_softplus(self.x_np, self.beta, self.threshold)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.softplus(x, self.beta, self.threshold)
        softplus = paddle.nn.Softplus(self.beta, self.threshold)
        out2 = softplus(x)
        out_ref = ref_softplus(self.x_np, self.beta, self.threshold)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
1883
        paddle.enable_static()
1884 1885 1886 1887 1888 1889 1890 1891 1892
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.softplus(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_softplus(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

    def test_errors(self):
1893
        paddle.enable_static()
1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.softplus, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.softplus, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.softplus(x_fp16)


def ref_softsign(x):
    out = np.divide(x, 1 + np.abs(x))
    return out


C
chengduo 已提交
1910
class TestSoftsign(TestActivation):
1911 1912
    def setUp(self):
        self.op_type = "softsign"
1913 1914
        self.init_dtype()

1915
        np.random.seed(1024)
1916 1917 1918
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
        out = ref_softsign(x)
        self.inputs = {'X': x}
1919
        self.outputs = {'Out': out}
1920 1921

    def test_check_grad(self):
1922 1923
        if self.dtype == np.float16:
            return
1924
        self.check_grad(['X'], 'Out')
1925 1926


1927 1928 1929
class TestSoftsignAPI(unittest.TestCase):
    # test paddle.nn.Softsign, paddle.nn.functional.softsign
    def setUp(self):
1930
        np.random.seed(1024)
1931 1932 1933 1934 1935
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
1936
        paddle.enable_static()
1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.softsign(x)
            softsign = paddle.nn.Softsign()
            out2 = softsign(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_softsign(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.softsign(x)
        softsign = paddle.nn.Softsign()
        out2 = softsign(x)
        out_ref = ref_softsign(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
1960
        paddle.enable_static()
1961 1962 1963 1964 1965 1966 1967 1968 1969
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.softsign(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_softsign(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

    def test_errors(self):
1970
        paddle.enable_static()
1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981
        with paddle.static.program_guard(paddle.static.Program()):
            # The input type must be Variable.
            self.assertRaises(TypeError, F.softsign, 1)
            # The input dtype must be float16, float32, float64.
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.softsign, x_int32)
            # support the input dtype is float16
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.softsign(x_fp16)


1982 1983 1984 1985 1986
def ref_thresholded_relu(x, threshold=1.0):
    out = (x > threshold) * x
    return out


C
chengduo 已提交
1987
class TestThresholdedRelu(TestActivation):
1988 1989
    def setUp(self):
        self.op_type = "thresholded_relu"
1990 1991
        self.init_dtype()

1992
        threshold = 15
1993

1994 1995 1996 1997 1998 1999
        np.random.seed(1024)
        x = np.random.uniform(-20, 20, [10, 12]).astype(self.dtype)
        x[np.abs(x) < 0.005] = 0.02
        out = ref_thresholded_relu(x, threshold)
        self.inputs = {'X': x}
        self.attrs = {"threshold": threshold}
2000
        self.outputs = {'Out': out}
2001 2002

    def test_check_grad(self):
2003 2004
        if self.dtype == np.float16:
            return
2005
        self.check_grad(['X'], 'Out')
2006 2007


2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051
class TestThresholdedReluAPI(unittest.TestCase):
    # test paddle.nn.ThresholdedReLU, paddle.nn.functional.thresholded_relu
    def setUp(self):
        self.threshold = 15
        np.random.seed(1024)
        self.x_np = np.random.uniform(-20, 20, [10, 12]).astype(np.float64)
        self.x_np[np.abs(self.x_np) < 0.005] = 0.02
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
        paddle.enable_static()
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.thresholded_relu(x, self.threshold)
            thresholded_relu = paddle.nn.ThresholdedReLU(self.threshold)
            out2 = thresholded_relu(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_thresholded_relu(self.x_np, self.threshold)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.thresholded_relu(x, self.threshold)
        thresholded_relu = paddle.nn.ThresholdedReLU(self.threshold)
        out2 = thresholded_relu(x)
        out_ref = ref_thresholded_relu(self.x_np, self.threshold)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
        paddle.enable_static()
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.thresholded_relu(x, self.threshold)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_thresholded_relu(self.x_np, self.threshold)
        self.assertEqual(np.allclose(out_ref, res[0]), True)

2052
    def test_errors(self):
2053 2054
        paddle.enable_static()
        with paddle.static.program_guard(paddle.static.Program()):
2055
            # The input type must be Variable.
2056
            self.assertRaises(TypeError, F.thresholded_relu, 1)
2057
            # The input dtype must be float16, float32, float64.
2058 2059
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.thresholded_relu, x_int32)
2060
            # support the input dtype is float16
2061 2062
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.thresholded_relu(x_fp16)
2063 2064


2065 2066 2067 2068
def ref_hardsigmoid(x, slope=0.166666666666667, offset=0.5):
    return np.maximum(np.minimum(x * slope + offset, 1.), 0.).astype(x.dtype)


C
chengduo 已提交
2069
class TestHardSigmoid(TestActivation):
2070 2071
    def setUp(self):
        self.op_type = "hard_sigmoid"
2072 2073 2074 2075
        self.dtype = 'float64'
        self.slope = 0.166666666666667
        self.offset = 0.5
        self.set_attrs()
2076

2077 2078 2079
        x = np.random.uniform(-5, 5, [10, 12]).astype(self.dtype)
        lower_threshold = -self.offset / self.slope
        upper_threshold = (1. - self.offset) / self.slope
Z
zhupengyang 已提交
2080

2081
        # Same reason as TestAbs
2082 2083 2084
        delta = 0.005
        x[np.abs(x - lower_threshold) < delta] = lower_threshold - 0.02
        x[np.abs(x - upper_threshold) < delta] = upper_threshold - 0.02
2085

2086
        out = ref_hardsigmoid(x, self.slope, self.offset)
2087

2088 2089
        self.attrs = {'slope': self.slope, 'offset': self.offset}
        self.inputs = {'X': x}
2090
        self.outputs = {'Out': out}
2091

2092 2093
    def set_attrs(self):
        pass
2094

2095

2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134
class TestHardSigmoidFP32(TestHardSigmoid):
    def set_attrs(self):
        self.dtype = 'float32'


class TestHardSigmoidSlopeOffset(TestHardSigmoid):
    def set_attrs(self):
        self.slope = 0.2
        self.offset = 0.4


class TestHardsigmoidAPI(unittest.TestCase):
    # test paddle.nn.Hardsigmoid, paddle.nn.functional.hardsigmoid
    def setUp(self):
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.hardsigmoid(x)
            m = paddle.nn.Hardsigmoid()
            out2 = m(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_hardsigmoid(self.x_np)
        for r in res:
            self.assertTrue(np.allclose(out_ref, r))

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.hardsigmoid(x)
        m = paddle.nn.Hardsigmoid()
        out2 = m(x)
        out_ref = ref_hardsigmoid(self.x_np)
        for r in [out1, out2]:
            self.assertTrue(np.allclose(out_ref, r.numpy()))
2135
        paddle.enable_static()
2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153

    def test_fluid_api(self):
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.hard_sigmoid(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_hardsigmoid(self.x_np, 0.2, 0.5)
        self.assertTrue(np.allclose(out_ref, res[0]))

        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out = paddle.fluid.layers.hard_sigmoid(x)
        self.assertTrue(np.allclose(out_ref, out.numpy()))
        paddle.enable_static()

    def test_errors(self):
        with paddle.static.program_guard(paddle.static.Program()):
2154
            # The input type must be Variable.
2155
            self.assertRaises(TypeError, F.hardsigmoid, 1)
2156
            # The input dtype must be float16, float32, float64.
2157 2158
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.hardsigmoid, x_int32)
2159
            # support the input dtype is float16
2160 2161
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.hardsigmoid(x_fp16)
2162 2163


2164 2165 2166 2167 2168
def ref_swish(x):
    out = x * expit(x)
    return out


C
chengduo 已提交
2169
class TestSwish(TestActivation):
A
Abhinav Arora 已提交
2170 2171
    def setUp(self):
        self.op_type = "swish"
2172 2173
        self.init_dtype()

2174
        np.random.seed(1024)
2175 2176 2177 2178
        x = np.random.uniform(-1, 1, [10, 12]).astype(self.dtype)
        out = ref_swish(x)
        self.inputs = {'X': x}
        self.attrs = {'slope': 1.0}
2179
        self.outputs = {'Out': out}
A
Abhinav Arora 已提交
2180 2181

    def test_check_grad(self):
2182 2183
        if self.dtype == np.float16:
            return
2184 2185
        self.check_grad(['X'], 'Out')

A
Abhinav Arora 已提交
2186

2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227
class TestSwishAPI(unittest.TestCase):
    # test paddle.nn.Swish, paddle.nn.functional.swish
    def setUp(self):
        np.random.seed(1024)
        self.x_np = np.random.uniform(-1, 1, [10, 12]).astype(np.float64)
        self.place=paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \
            else paddle.CPUPlace()

    def test_static_api(self):
        paddle.enable_static()
        with paddle.static.program_guard(paddle.static.Program()):
            x = paddle.data('X', self.x_np.shape, self.x_np.dtype)
            out1 = F.swish(x)
            swish = paddle.nn.Swish()
            out2 = swish(x)
            exe = paddle.static.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out1, out2])
        out_ref = ref_swish(self.x_np)
        for r in res:
            self.assertEqual(np.allclose(out_ref, r), True)

    def test_dygraph_api(self):
        paddle.disable_static(self.place)
        x = paddle.to_tensor(self.x_np)
        out1 = F.swish(x)
        swish = paddle.nn.Swish()
        out2 = swish(x)
        out_ref = ref_swish(self.x_np)
        for r in [out1, out2]:
            self.assertEqual(np.allclose(out_ref, r.numpy()), True)
        paddle.enable_static()

    def test_fluid_api(self):
        paddle.enable_static()
        with fluid.program_guard(fluid.Program()):
            x = fluid.data('X', self.x_np.shape, self.x_np.dtype)
            out = fluid.layers.swish(x)
            exe = fluid.Executor(self.place)
            res = exe.run(feed={'X': self.x_np}, fetch_list=[out])
        out_ref = ref_swish(self.x_np)
        self.assertEqual(np.allclose(out_ref, res[0]), True)
2228

2229
    def test_errors(self):
2230 2231
        paddle.enable_static()
        with paddle.static.program_guard(paddle.static.Program()):
2232
            # The input type must be Variable.
2233
            self.assertRaises(TypeError, F.swish, 1)
2234
            # The input dtype must be float16, float32, float64.
2235 2236
            x_int32 = paddle.data(name='x_int32', shape=[12, 10], dtype='int32')
            self.assertRaises(TypeError, F.swish, x_int32)
2237
            # support the input dtype is float16
2238 2239
            x_fp16 = paddle.data(name='x_fp16', shape=[12, 10], dtype='float16')
            F.swish(x_fp16)
2240 2241


2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274
#------------------ Test Error Activation----------------------
def create_test_error_class(op_type):
    class TestOpErrors(unittest.TestCase):
        def test_errors(self):
            with program_guard(Program(), Program()):
                op = getattr(fluid.layers, op_type)
                # The input dtype of op_type must be float32, float64.
                in1 = fluid.layers.data(
                    name='input2', shape=[12, 10], dtype="int32")
                in2 = fluid.layers.data(
                    name='input3', shape=[12, 10], dtype="int64")
                self.assertRaises(TypeError, op, in1)
                self.assertRaises(TypeError, op, in2)

    cls_name = "{0}_{1}".format(op_type, "test_errors")
    TestOpErrors.__name__ = cls_name
    globals()[cls_name] = TestOpErrors


create_test_error_class('acos')
create_test_error_class('asin')
create_test_error_class('atan')
create_test_error_class('ceil')
create_test_error_class('cos')
create_test_error_class('floor')
create_test_error_class('reciprocal')
create_test_error_class('round')
create_test_error_class('rsqrt')
create_test_error_class('sin')
create_test_error_class('sqrt')
create_test_error_class('tanh')


2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293
#------------------ Test Cudnn Activation----------------------
def create_test_act_cudnn_class(parent, atol=1e-3, grad_atol=1e-3):
    @unittest.skipIf(not core.is_compiled_with_cuda(),
                     "core is not compiled with CUDA")
    class TestActCudnn(parent):
        def init_kernel_type(self):
            self.attrs = {"use_cudnn": True}

    cls_name = "{0}_{1}".format(parent.__name__, "cudnn")
    TestActCudnn.__name__ = cls_name
    globals()[cls_name] = TestActCudnn


create_test_act_cudnn_class(TestRelu)
create_test_act_cudnn_class(TestRelu6)
create_test_act_cudnn_class(TestSigmoid)
create_test_act_cudnn_class(TestTanh)


C
chengduo 已提交
2294 2295 2296 2297 2298 2299 2300 2301 2302 2303
#------------------ Test Fp16 ----------------------
def create_test_act_fp16_class(parent,
                               atol=1e-3,
                               grad_check=True,
                               grad_atol=0.80):
    @unittest.skipIf(not core.is_compiled_with_cuda(),
                     "core is not compiled with CUDA")
    class TestActFp16(parent):
        def init_dtype(self):
            self.dtype = np.float16
2304

C
chengduo 已提交
2305
        def test_check_output(self):
2306
            place = core.CUDAPlace(0)
C
chengduo 已提交
2307 2308 2309
            support_fp16 = core.is_float16_supported(place)
            if support_fp16:
                self.check_output_with_place(place, atol=atol)
2310

C
chengduo 已提交
2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326
        def test_check_grad(self):
            place = core.CUDAPlace(0)
            support_fp16 = core.is_float16_supported(place)
            if support_fp16 and grad_check:
                self.check_grad_with_place(
                    place, ['X'], 'Out', max_relative_error=grad_atol)

    cls_name = "{0}_{1}".format(parent.__name__, "fp16")
    TestActFp16.__name__ = cls_name
    globals()[cls_name] = TestActFp16


create_test_act_fp16_class(TestActivation)
create_test_act_fp16_class(TestSigmoid)
create_test_act_fp16_class(TestLogSigmoid)
create_test_act_fp16_class(TestTanh)
2327
create_test_act_fp16_class(TestTanhshrink)
C
chengduo 已提交
2328
create_test_act_fp16_class(TestHardShrink)
2329
create_test_act_fp16_class(TestSoftshrink)
C
chengduo 已提交
2330 2331 2332 2333 2334
create_test_act_fp16_class(TestSqrt)
create_test_act_fp16_class(TestAbs)
create_test_act_fp16_class(TestCeil, grad_check=False)
create_test_act_fp16_class(TestFloor, grad_check=False)
create_test_act_fp16_class(TestCos, grad_atol=0.85)
2335
create_test_act_fp16_class(TestCosh, grad_atol=0.85)
2336
create_test_act_fp16_class(TestAcos, grad_atol=0.85)
C
chengduo 已提交
2337
create_test_act_fp16_class(TestSin)
2338
create_test_act_fp16_class(TestSinh)
2339 2340
create_test_act_fp16_class(TestAsin)
create_test_act_fp16_class(TestAtan)
C
chengduo 已提交
2341 2342
create_test_act_fp16_class(TestRound, grad_check=False)
create_test_act_fp16_class(TestRelu)
C
Clementine 已提交
2343
create_test_act_fp16_class(TestGelu)
C
chengduo 已提交
2344 2345 2346 2347 2348 2349
create_test_act_fp16_class(TestBRelu)
create_test_act_fp16_class(TestRelu6)
create_test_act_fp16_class(TestSoftRelu)
create_test_act_fp16_class(TestELU)
create_test_act_fp16_class(TestReciprocal)
create_test_act_fp16_class(TestLog)
2350
create_test_act_fp16_class(TestLog1p, grad_atol=0.9)
C
chengduo 已提交
2351 2352
create_test_act_fp16_class(TestSquare)
create_test_act_fp16_class(TestPow, atol=5e-2)
2353
create_test_act_fp16_class(TestPow_factor_tensor, atol=5e-2)
C
chengduo 已提交
2354 2355 2356 2357 2358 2359
create_test_act_fp16_class(TestSTanh, grad_atol=0.9)
create_test_act_fp16_class(TestSoftplus)
create_test_act_fp16_class(TestSoftsign)
create_test_act_fp16_class(TestThresholdedRelu)
create_test_act_fp16_class(TestHardSigmoid)
create_test_act_fp16_class(TestSwish)
H
huangjun12 已提交
2360
create_test_act_fp16_class(TestHardSwish)
A
Abhinav Arora 已提交
2361

Q
qijun 已提交
2362 2363
if __name__ == "__main__":
    unittest.main()