test_activation_nn_grad.py 18.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#   Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import unittest
import numpy as np

import paddle.fluid as fluid
19
import paddle
20 21 22
import paddle.fluid.layers as layers
import paddle.fluid.core as core
import gradient_checker
23
import paddle.nn.functional as F
24 25 26 27

from decorator_helper import prog_scope


28
class TestSigmoidTripleGradCheck(unittest.TestCase):
29

30 31 32 33 34 35 36 37 38 39
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0005
        dtype = np.float64
        x = layers.data('x', shape, False, dtype=dtype)
        x.persistable = True
        y = layers.sigmoid(x)
        x_arr = np.random.random(shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.002
40 41 42 43 44
        gradient_checker.triple_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
45 46

    def test_grad(self):
47
        paddle.enable_static()
48 49 50 51 52 53 54
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


55
class TestSigmoidDoubleGradCheck(unittest.TestCase):
56

57 58 59
    def sigmoid_wrapper(self, x):
        return fluid.layers.sigmoid(x[0])

60 61 62 63 64 65 66 67 68 69
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0005
        dtype = np.float64
        x = layers.data('x', shape, False, dtype=dtype)
        x.persistable = True
        y = layers.sigmoid(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.002
70 71 72 73 74
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
75
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
76 77 78 79 80
        gradient_checker.double_grad_check_for_dygraph(self.sigmoid_wrapper,
                                                       [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
81
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
82 83

    def test_grad(self):
84
        paddle.enable_static()
85 86 87 88 89 90 91
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


92
class TestTanhTripleGradCheck(unittest.TestCase):
93

94 95 96
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

97 98 99 100 101 102 103 104 105 106
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0005
        dtype = np.float64
        x = layers.data('x', shape, False, dtype=dtype)
        x.persistable = True
        y = layers.tanh(x)
        x_arr = np.random.random(shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.002
107 108 109 110 111
        gradient_checker.triple_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
112
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
113 114 115 116
        gradient_checker.triple_grad_check_for_dygraph(self.tanh_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
117
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
118 119

    def test_grad(self):
120
        paddle.enable_static()
121 122 123 124 125 126 127
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


128
class TestTanhDoubleGradCheck(unittest.TestCase):
129

130 131 132
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

133 134 135 136 137 138 139 140 141 142
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0005
        dtype = np.float64
        x = layers.data('x', shape, False, dtype=dtype)
        x.persistable = True
        y = paddle.tanh(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.002
143 144 145 146 147
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
148
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
149 150 151 152
        gradient_checker.double_grad_check_for_dygraph(self.tanh_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
153
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
154 155

    def test_grad(self):
156
        paddle.enable_static()
157 158 159 160 161 162 163
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


164
class TestAbsDoubleGradCheck(unittest.TestCase):
165

166 167 168 169 170 171 172 173 174 175 176 177 178
    def abs_wrapper(self, x):
        return paddle.abs(x[0])

    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0005
        dtype = np.float64
        x = layers.data('x', shape, False, dtype=dtype)
        x.persistable = True
        y = paddle.abs(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.002
179 180 181 182 183
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
184
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
185 186 187 188
        gradient_checker.double_grad_check_for_dygraph(self.abs_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
189
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
190 191 192 193 194 195 196 197 198 199

    def test_grad(self):
        paddle.enable_static()
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


200
class TestReluDoubleGradCheck(unittest.TestCase):
201

202 203 204 205 206 207 208 209 210 211 212 213
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.005
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True
        y = layers.relu(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.02

214 215 216 217 218
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
219 220

    def test_grad(self):
221
        paddle.enable_static()
222 223 224 225 226 227 228 229
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


class TestLeakyReluDoubleGradCheck(unittest.TestCase):
230

231 232 233
    def leaky_relu_wrapper(self, x):
        return paddle.nn.functional.leaky_relu(x[0], negative_slope=0.2)

234 235 236 237 238 239 240 241 242 243 244 245 246 247
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.005
        alpha = 0.2
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True

        y = layers.leaky_relu(x, alpha=alpha)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        x_arr[np.abs(x_arr) < 0.005] = 0.02

248 249 250 251 252 253 254 255 256 257
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
        gradient_checker.double_grad_check_for_dygraph(self.leaky_relu_wrapper,
                                                       [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
258 259

    def test_grad(self):
260
        paddle.enable_static()
261 262 263 264 265 266 267
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


D
Double_V 已提交
268
class TestELUDoubleGradCheck(unittest.TestCase):
269

270 271 272
    def elu_wrapper(self, x):
        return paddle.nn.functional.elu(x[0], alpha=0.2)

D
Double_V 已提交
273 274
    @prog_scope()
    def func(self, place):
275
        shape = [2, 4, 4, 4]
D
Double_V 已提交
276
        eps = 1e-6
277
        alpha = 0.2
D
Double_V 已提交
278
        dtype = np.float64
279
        SEED = 0
D
Double_V 已提交
280 281 282 283 284

        x = layers.data('x', shape, False, dtype)
        x.persistable = True

        y = layers.elu(x, alpha=alpha)
285
        np.random.RandomState(SEED)
D
Double_V 已提交
286
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
287 288 289 290 291
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
292
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
293 294 295 296
        gradient_checker.double_grad_check_for_dygraph(self.elu_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
297
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
D
Double_V 已提交
298 299

    def test_grad(self):
300
        paddle.enable_static()
D
Double_V 已提交
301 302 303 304 305 306 307
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


308
class TestCELUDoubleGradCheck(unittest.TestCase):
309

310 311 312
    def celu_wrapper(self, x):
        return paddle.nn.functional.celu(x[0], alpha=0.2)

313 314 315 316 317 318 319 320 321 322 323 324 325 326
    @prog_scope()
    def func(self, place):
        shape = [2, 4, 4, 4]
        eps = 1e-6
        alpha = 0.2
        dtype = np.float64
        SEED = 0

        x = layers.data('x', shape, False, dtype)
        x.persistable = True

        y = F.celu(x, alpha=alpha)
        np.random.RandomState(SEED)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
327 328 329 330 331
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
332
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
333 334 335 336
        gradient_checker.double_grad_check_for_dygraph(self.celu_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
337
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
338 339

    def test_grad(self):
340
        paddle.enable_static()
341 342 343 344 345 346 347
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


348
class TestSqrtDoubleGradCheck(unittest.TestCase):
349

350 351 352
    def sqrt_wrapper(self, x):
        return paddle.sqrt(x[0])

353 354 355 356 357 358 359 360 361 362 363 364
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0001
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True

        y = layers.sqrt(x)
        x_arr = np.random.uniform(0.1, 1, shape).astype(dtype)

365 366 367 368 369 370 371 372 373
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
        gradient_checker.double_grad_check_for_dygraph(self.sqrt_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
374 375

    def test_grad(self):
376
        paddle.enable_static()
377 378 379 380 381 382 383
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


W
whs 已提交
384
class TestRsqrtDoubleGradCheck(unittest.TestCase):
385

386 387 388
    def rsqrt_wrapper(self, x):
        return paddle.rsqrt(x[0])

W
whs 已提交
389 390 391 392 393 394 395 396 397 398 399 400
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 0.0001
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True

        y = layers.rsqrt(x)
        x_arr = np.random.uniform(0.1, 1, shape).astype(dtype)

401 402 403 404 405 406 407 408 409
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
        gradient_checker.double_grad_check_for_dygraph(self.rsqrt_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
W
whs 已提交
410 411

    def test_grad(self):
412
        paddle.enable_static()
W
whs 已提交
413 414 415 416 417 418 419
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


420
class TestSquareDoubleGradCheck(unittest.TestCase):
421

422 423 424
    def square_wrapper(self, x):
        return paddle.square(x[0])

425 426
    @prog_scope()
    def func(self, place):
T
tianshuo78520a 已提交
427
        # the shape of input variable should be clearly specified, not inlcude -1.
428 429 430 431 432 433 434 435 436
        shape = [2, 3, 7, 9]
        eps = 0.005
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True
        y = layers.square(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)

437 438 439 440 441
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
442
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
443 444 445 446
        gradient_checker.double_grad_check_for_dygraph(self.square_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
447
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
448 449

    def test_grad(self):
450
        paddle.enable_static()
451 452 453 454 455 456 457
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


Z
Zhong Hui 已提交
458
class TestAbsDoubleGradCheck(unittest.TestCase):
459

Z
Zhong Hui 已提交
460 461 462 463 464 465 466 467 468 469 470
    @prog_scope()
    def func(self, place):
        # the shape of input variable should be clearly specified, not inlcude -1.
        shape = [2, 3, 7, 9]
        eps = 1e-6
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True
        y = layers.abs(x)
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
Z
Zhong Hui 已提交
471 472 473 474
        # Because we set delta = 0.005 in calculating numeric gradient,
        # if x is too small, the numeric gradient is inaccurate.
        # we should avoid this
        x_arr[np.abs(x_arr) < 0.005] = 0.02
Z
Zhong Hui 已提交
475

476 477 478 479 480
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
Z
Zhong Hui 已提交
481 482

    def test_grad(self):
483
        paddle.enable_static()
Z
Zhong Hui 已提交
484 485 486 487 488 489 490
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


491
class TestLogDoubleGradCheck(unittest.TestCase):
492

493 494 495
    def log_wrapper(self, x):
        return paddle.log(x[0])

496 497 498 499 500 501 502 503 504 505 506 507
    @prog_scope()
    def func(self, place):
        shape = [2, 3, 7, 9]
        eps = 1e-6
        dtype = np.float64

        x = layers.data('x', shape, False, dtype)
        x.persistable = True
        y = layers.log(x)

        x_arr = np.random.uniform(0.1, 1, shape).astype(dtype)

508 509 510 511 512
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
513
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
514 515 516 517
        gradient_checker.double_grad_check_for_dygraph(self.log_wrapper, [x],
                                                       y,
                                                       x_init=x_arr,
                                                       place=place)
518
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
519 520

    def test_grad(self):
521
        paddle.enable_static()
522 523 524 525 526 527 528
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


529 530
if __name__ == "__main__":
    unittest.main()