test_activation_nn_grad.py 15.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#   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.

from __future__ import print_function

import unittest
import numpy as np

import paddle.fluid as fluid
21
import paddle
22 23 24
import paddle.fluid.layers as layers
import paddle.fluid.core as core
import gradient_checker
25
import paddle.nn.functional as F
26
from paddle.fluid.framework import _test_eager_guard
27 28 29 30

from decorator_helper import prog_scope


31
class TestSigmoidTripleGradCheck(unittest.TestCase):
32

33 34 35 36 37 38 39 40 41 42
    @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
43 44 45 46 47
        gradient_checker.triple_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
48 49

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


58
class TestSigmoidDoubleGradCheck(unittest.TestCase):
59

60 61 62
    def sigmoid_wrapper(self, x):
        return fluid.layers.sigmoid(x[0])

63 64 65 66 67 68 69 70 71 72 73 74
    @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
        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
        gradient_checker.double_grad_check_for_dygraph(
            self.sigmoid_wrapper, [x], y, x_init=x_arr, place=place)
78
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
79 80

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


89
class TestTanhTripleGradCheck(unittest.TestCase):
90

91 92 93
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

94 95 96 97 98 99 100 101 102 103 104 105
    @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
        gradient_checker.triple_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
106
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
107 108
        gradient_checker.triple_grad_check_for_dygraph(
            self.tanh_wrapper, [x], y, x_init=x_arr, place=place)
109
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
110 111

    def test_grad(self):
112
        paddle.enable_static()
113 114 115 116 117 118 119
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


120
class TestTanhDoubleGradCheck(unittest.TestCase):
121

122 123 124
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

125 126 127 128 129 130 131 132 133 134 135 136
    @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
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
137
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
138 139
        gradient_checker.double_grad_check_for_dygraph(
            self.tanh_wrapper, [x], y, x_init=x_arr, place=place)
140
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
141 142

    def test_grad(self):
143
        paddle.enable_static()
144 145 146 147 148 149 150
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


151
class TestAbsDoubleGradCheck(unittest.TestCase):
152

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
    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
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
168
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
169 170
        gradient_checker.double_grad_check_for_dygraph(
            self.abs_wrapper, [x], y, x_init=x_arr, place=place)
171
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
172 173 174 175 176 177 178 179 180 181

    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)


182
class TestReluDoubleGradCheck(unittest.TestCase):
183

184 185 186 187 188 189 190 191 192 193 194 195
    @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

196 197 198 199 200
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
201 202

    def test_grad(self):
203
        paddle.enable_static()
204 205 206 207 208 209 210 211
        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):
212

213 214 215
    def leaky_relu_wrapper(self, x):
        return paddle.nn.functional.leaky_relu(x[0], negative_slope=0.2)

216 217 218 219 220 221 222 223 224 225 226 227 228 229
    @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

230 231 232 233 234 235 236 237 238 239
        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)
240 241

    def test_grad(self):
242
        paddle.enable_static()
243 244 245 246 247 248 249
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


D
Double_V 已提交
250
class TestELUDoubleGradCheck(unittest.TestCase):
251

252 253 254
    def elu_wrapper(self, x):
        return paddle.nn.functional.elu(x[0], alpha=0.2)

D
Double_V 已提交
255 256
    @prog_scope()
    def func(self, place):
257
        shape = [2, 4, 4, 4]
D
Double_V 已提交
258
        eps = 1e-6
259
        alpha = 0.2
D
Double_V 已提交
260
        dtype = np.float64
261
        SEED = 0
D
Double_V 已提交
262 263 264 265 266

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

        y = layers.elu(x, alpha=alpha)
267
        np.random.RandomState(SEED)
D
Double_V 已提交
268 269 270
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
271
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
272 273
        gradient_checker.double_grad_check_for_dygraph(
            self.elu_wrapper, [x], y, x_init=x_arr, place=place)
274
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
D
Double_V 已提交
275 276

    def test_grad(self):
277
        paddle.enable_static()
D
Double_V 已提交
278 279 280 281 282 283 284
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


285
class TestCELUDoubleGradCheck(unittest.TestCase):
286

287 288 289
    def celu_wrapper(self, x):
        return paddle.nn.functional.celu(x[0], alpha=0.2)

290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
    @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)
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
306
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
307 308
        gradient_checker.double_grad_check_for_dygraph(
            self.celu_wrapper, [x], y, x_init=x_arr, place=place)
309
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
310 311

    def test_grad(self):
312
        paddle.enable_static()
313 314 315 316 317 318 319
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


320
class TestSqrtDoubleGradCheck(unittest.TestCase):
321

322 323 324
    def sqrt_wrapper(self, x):
        return paddle.sqrt(x[0])

325 326 327 328 329 330 331 332 333 334 335 336
    @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)

337 338 339 340 341 342 343 344 345
        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)
346 347

    def test_grad(self):
348
        paddle.enable_static()
349 350 351 352 353 354 355
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


W
whs 已提交
356
class TestRsqrtDoubleGradCheck(unittest.TestCase):
357

358 359 360
    def rsqrt_wrapper(self, x):
        return paddle.rsqrt(x[0])

W
whs 已提交
361 362 363 364 365 366 367 368 369 370 371 372
    @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)

373 374 375 376 377 378 379 380 381
        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 已提交
382 383

    def test_grad(self):
384
        paddle.enable_static()
W
whs 已提交
385 386 387 388 389 390 391
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


392
class TestSquareDoubleGradCheck(unittest.TestCase):
393

394 395 396
    def square_wrapper(self, x):
        return paddle.square(x[0])

397 398
    @prog_scope()
    def func(self, place):
T
tianshuo78520a 已提交
399
        # the shape of input variable should be clearly specified, not inlcude -1.
400 401 402 403 404 405 406 407 408 409 410
        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)

        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
411
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
412 413
        gradient_checker.double_grad_check_for_dygraph(
            self.square_wrapper, [x], y, x_init=x_arr, place=place)
414
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
415 416

    def test_grad(self):
417
        paddle.enable_static()
418 419 420 421 422 423 424
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


Z
Zhong Hui 已提交
425
class TestAbsDoubleGradCheck(unittest.TestCase):
426

Z
Zhong Hui 已提交
427 428 429 430 431 432 433 434 435 436 437
    @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 已提交
438 439 440 441
        # 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 已提交
442

443 444 445 446 447
        gradient_checker.double_grad_check([x],
                                           y,
                                           x_init=x_arr,
                                           place=place,
                                           eps=eps)
Z
Zhong Hui 已提交
448 449

    def test_grad(self):
450
        paddle.enable_static()
Z
Zhong Hui 已提交
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)


458
class TestLogDoubleGradCheck(unittest.TestCase):
459

460 461 462
    def log_wrapper(self, x):
        return paddle.log(x[0])

463 464 465 466 467 468 469 470 471 472 473 474 475 476
    @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)

        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps)
477
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
478 479
        gradient_checker.double_grad_check_for_dygraph(
            self.log_wrapper, [x], y, x_init=x_arr, place=place)
480
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
481 482

    def test_grad(self):
483
        paddle.enable_static()
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 492
if __name__ == "__main__":
    unittest.main()