test_activation_nn_grad.py 14.4 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 29 30 31 32 33 34 35 36 37 38
class TestSigmoidTripleGradCheck(unittest.TestCase):
    @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
39 40 41
        gradient_checker.triple_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
42 43

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


52
class TestSigmoidDoubleGradCheck(unittest.TestCase):
53 54 55
    def sigmoid_wrapper(self, x):
        return fluid.layers.sigmoid(x[0])

56 57 58 59 60 61 62 63 64 65
    @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
66 67 68
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
69
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
70 71 72
        gradient_checker.double_grad_check_for_dygraph(
            self.sigmoid_wrapper, [x], y, x_init=x_arr, place=place
        )
73
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
74 75

    def test_grad(self):
76
        paddle.enable_static()
77 78 79 80 81 82 83
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


84
class TestTanhTripleGradCheck(unittest.TestCase):
85 86 87
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

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

    def test_grad(self):
108
        paddle.enable_static()
109 110 111 112 113 114 115
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


116
class TestTanhDoubleGradCheck(unittest.TestCase):
117 118 119
    def tanh_wrapper(self, x):
        return paddle.tanh(x[0])

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

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


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

    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)


180 181 182 183 184 185 186 187 188 189 190 191 192
class TestReluDoubleGradCheck(unittest.TestCase):
    @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

193 194 195
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
196 197

    def test_grad(self):
198
        paddle.enable_static()
199 200 201 202 203 204 205 206
        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):
207 208 209
    def leaky_relu_wrapper(self, x):
        return paddle.nn.functional.leaky_relu(x[0], negative_slope=0.2)

210 211 212 213 214 215 216 217 218 219 220 221 222 223
    @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

224 225 226 227 228 229
        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
        )
230 231

    def test_grad(self):
232
        paddle.enable_static()
233 234 235 236 237 238 239
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


D
Double_V 已提交
240
class TestELUDoubleGradCheck(unittest.TestCase):
241 242 243
    def elu_wrapper(self, x):
        return paddle.nn.functional.elu(x[0], alpha=0.2)

D
Double_V 已提交
244 245
    @prog_scope()
    def func(self, place):
246
        shape = [2, 4, 4, 4]
D
Double_V 已提交
247
        eps = 1e-6
248
        alpha = 0.2
D
Double_V 已提交
249
        dtype = np.float64
250
        SEED = 0
D
Double_V 已提交
251 252 253 254 255

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

        y = layers.elu(x, alpha=alpha)
256
        np.random.RandomState(SEED)
D
Double_V 已提交
257
        x_arr = np.random.uniform(-1, 1, shape).astype(dtype)
258 259 260
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
261
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
262 263 264
        gradient_checker.double_grad_check_for_dygraph(
            self.elu_wrapper, [x], y, x_init=x_arr, place=place
        )
265
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
D
Double_V 已提交
266 267

    def test_grad(self):
268
        paddle.enable_static()
D
Double_V 已提交
269 270 271 272 273 274 275
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


276
class TestCELUDoubleGradCheck(unittest.TestCase):
277 278 279
    def celu_wrapper(self, x):
        return paddle.nn.functional.celu(x[0], alpha=0.2)

280 281 282 283 284 285 286 287 288 289 290 291 292 293
    @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)
294 295 296
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
297
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
298 299 300
        gradient_checker.double_grad_check_for_dygraph(
            self.celu_wrapper, [x], y, x_init=x_arr, place=place
        )
301
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
302 303

    def test_grad(self):
304
        paddle.enable_static()
305 306 307 308 309 310 311
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


312
class TestSqrtDoubleGradCheck(unittest.TestCase):
313 314 315
    def sqrt_wrapper(self, x):
        return paddle.sqrt(x[0])

316 317 318 319 320 321 322 323 324 325 326 327
    @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)

328 329 330 331 332 333
        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
        )
334 335

    def test_grad(self):
336
        paddle.enable_static()
337 338 339 340 341 342 343
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


W
whs 已提交
344
class TestRsqrtDoubleGradCheck(unittest.TestCase):
345 346 347
    def rsqrt_wrapper(self, x):
        return paddle.rsqrt(x[0])

W
whs 已提交
348 349 350 351 352 353 354 355 356 357 358 359
    @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)

360 361 362 363 364 365
        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 已提交
366 367

    def test_grad(self):
368
        paddle.enable_static()
W
whs 已提交
369 370 371 372 373 374 375
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places = [fluid.CUDAPlace(0)]
        for p in places:
            self.func(p)


376
class TestSquareDoubleGradCheck(unittest.TestCase):
377 378 379
    def square_wrapper(self, x):
        return paddle.square(x[0])

380 381
    @prog_scope()
    def func(self, place):
T
tianshuo78520a 已提交
382
        # the shape of input variable should be clearly specified, not inlcude -1.
383 384 385 386 387 388 389 390 391
        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)

392 393 394
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
395
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
396 397 398
        gradient_checker.double_grad_check_for_dygraph(
            self.square_wrapper, [x], y, x_init=x_arr, place=place
        )
399
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
400 401

    def test_grad(self):
402
        paddle.enable_static()
403 404 405 406 407 408 409
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


Z
Zhong Hui 已提交
410 411 412 413 414 415 416 417 418 419 420 421
class TestAbsDoubleGradCheck(unittest.TestCase):
    @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 已提交
422 423 424 425
        # 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 已提交
426

427 428 429
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
Z
Zhong Hui 已提交
430 431

    def test_grad(self):
432
        paddle.enable_static()
Z
Zhong Hui 已提交
433 434 435 436 437 438 439
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


440
class TestLogDoubleGradCheck(unittest.TestCase):
441 442 443
    def log_wrapper(self, x):
        return paddle.log(x[0])

444 445 446 447 448 449 450 451 452 453 454 455
    @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)

456 457 458
        gradient_checker.double_grad_check(
            [x], y, x_init=x_arr, place=place, eps=eps
        )
459
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
460 461 462
        gradient_checker.double_grad_check_for_dygraph(
            self.log_wrapper, [x], y, x_init=x_arr, place=place
        )
463
        fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": False})
464 465

    def test_grad(self):
466
        paddle.enable_static()
467 468 469 470 471 472 473
        places = [fluid.CPUPlace()]
        if core.is_compiled_with_cuda():
            places.append(fluid.CUDAPlace(0))
        for p in places:
            self.func(p)


474 475
if __name__ == "__main__":
    unittest.main()