test_layers.py 114.2 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
import contextlib
import inspect
Q
Qiao Longfei 已提交
17 18
import unittest

19
import numpy as np
20
from decorator_helper import prog_scope
21
from test_imperative_base import new_program_scope
22 23 24

import paddle
import paddle.fluid as fluid
25
import paddle.fluid.layers as layers
26
import paddle.fluid.nets as nets
27
import paddle.nn.functional as F
28
from paddle.fluid import core
29
from paddle.fluid.dygraph import base, to_variable
30 31 32 33 34 35
from paddle.fluid.framework import (
    Program,
    _test_eager_guard,
    default_main_program,
    program_guard,
)
36
from paddle.tensor import random
37 38 39 40 41 42 43 44 45 46 47


class LayerTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.seed = 111

    @classmethod
    def tearDownClass(cls):
        pass

48 49 50 51 52 53 54 55
    def _get_place(self, force_to_use_cpu=False):
        # this option for ops that only have cpu kernel
        if force_to_use_cpu:
            return core.CPUPlace()
        else:
            if core.is_compiled_with_cuda():
                return core.CUDAPlace(0)
            return core.CPUPlace()
56 57 58 59

    @contextlib.contextmanager
    def static_graph(self):
        with new_program_scope():
C
cnn 已提交
60
            paddle.seed(self.seed)
L
Leo Chen 已提交
61
            paddle.framework.random._manual_program_seed(self.seed)
62 63
            yield

64 65 66
    def get_static_graph_result(
        self, feed, fetch_list, with_lod=False, force_to_use_cpu=False
    ):
67
        exe = fluid.Executor(self._get_place(force_to_use_cpu))
68
        exe.run(fluid.default_startup_program())
69 70 71 72 73 74
        return exe.run(
            fluid.default_main_program(),
            feed=feed,
            fetch_list=fetch_list,
            return_numpy=(not with_lod),
        )
75 76

    @contextlib.contextmanager
77
    def dynamic_graph(self, force_to_use_cpu=False):
L
lujun 已提交
78
        with fluid.dygraph.guard(
79 80
            self._get_place(force_to_use_cpu=force_to_use_cpu)
        ):
C
cnn 已提交
81
            paddle.seed(self.seed)
L
Leo Chen 已提交
82
            paddle.framework.random._manual_program_seed(self.seed)
83 84 85 86
            yield


class TestLayer(LayerTest):
87 88
    def test_custom_layer_with_kwargs(self):
        class CustomLayer(fluid.Layer):
89
            def __init__(self, input_size, linear1_size=4):
90
                super().__init__()
91
                self.linear1 = paddle.nn.Linear(
92 93
                    input_size, linear1_size, bias_attr=False
                )
94 95 96
                self.linear2 = paddle.nn.Linear(
                    linear1_size, 1, bias_attr=False
                )
97 98 99 100 101

            def forward(self, x, do_linear2=False):
                ret = self.linear1(x)
                if do_linear2:
                    ret = self.linear2(ret)
102 103 104
                return ret

        with self.dynamic_graph():
105 106 107 108 109
            with _test_eager_guard():
                inp = np.ones([3, 3], dtype='float32')
                x = base.to_variable(inp)
                custom = CustomLayer(input_size=3, linear1_size=2)
                ret = custom(x, do_linear2=False)
110
                np.testing.assert_array_equal(ret.numpy().shape, [3, 2])
111
                ret = custom(x, do_linear2=True)
112
                np.testing.assert_array_equal(ret.numpy().shape, [3, 1])
113 114
            inp = np.ones([3, 3], dtype='float32')
            x = base.to_variable(inp)
115 116
            custom = CustomLayer(input_size=3, linear1_size=2)
            ret = custom(x, do_linear2=False)
117
            np.testing.assert_array_equal(ret.numpy().shape, [3, 2])
118
            ret = custom(x, do_linear2=True)
119
            np.testing.assert_array_equal(ret.numpy().shape, [3, 1])
120

S
songyouwei 已提交
121 122 123
    def test_linear(self):
        inp = np.ones([3, 32, 32], dtype='float32')
        with self.static_graph():
124 125 126 127 128 129
            t = layers.data(
                name='data',
                shape=[3, 32, 32],
                dtype='float32',
                append_batch_size=False,
            )
130
            linear = paddle.nn.Linear(
131 132
                32, 4, bias_attr=fluid.initializer.ConstantInitializer(value=1)
            )
S
songyouwei 已提交
133
            ret = linear(t)
134 135 136
            static_ret = self.get_static_graph_result(
                feed={'data': inp}, fetch_list=[ret]
            )[0]
S
songyouwei 已提交
137
        with self.dynamic_graph():
138 139
            with _test_eager_guard():
                t = base.to_variable(inp)
140
                linear = paddle.nn.Linear(
141 142
                    32,
                    4,
143 144
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
145 146 147
                dy_eager_ret = linear(t)
                dy_eager_ret_value = dy_eager_ret.numpy()

S
songyouwei 已提交
148
            t = base.to_variable(inp)
149
            linear = paddle.nn.Linear(
150 151
                32, 4, bias_attr=fluid.initializer.ConstantInitializer(value=1)
            )
S
songyouwei 已提交
152 153 154
            dy_ret = linear(t)
            dy_ret_value = dy_ret.numpy()

155 156
        np.testing.assert_array_equal(static_ret, dy_eager_ret_value)
        np.testing.assert_array_equal(static_ret, dy_ret_value)
S
songyouwei 已提交
157

158 159 160 161 162
        with self.static_graph():

            # the input of Linear must be Variable.
            def test_Variable():
                inp = np.ones([3, 32, 32], dtype='float32')
163
                linear = paddle.nn.Linear(
164 165
                    32,
                    4,
166 167
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
168 169 170 171 172 173 174 175
                linear_ret1 = linear(inp)

            self.assertRaises(TypeError, test_Variable)

            # the input dtype of Linear must be float16 or float32 or float64
            # float16 only can be set on GPU place
            def test_type():
                inp = np.ones([3, 32, 32], dtype='int32')
176
                linear = paddle.nn.Linear(
177 178
                    32,
                    4,
179 180
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
181 182 183 184
                linear_ret2 = linear(inp)

            self.assertRaises(TypeError, test_type)

W
wangzhen38 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
    def test_cvm(self):
        inp = np.ones([10, 10], dtype='float32')
        arr = [[0.6931472, -1.904654e-09, 1, 1, 1, 1, 1, 1, 1, 1]] * 10
        cvm1 = np.array(arr, dtype='float32')
        cvm2 = np.ones([10, 8], dtype='float32')
        show_clk = np.ones([10, 2], dtype='float32')
        with self.static_graph():
            x = paddle.static.data(
                name='data',
                shape=[10, 10],
                dtype='float32',
            )
            u = paddle.static.data(
                name='show_click',
                shape=[10, 2],
                dtype='float32',
            )
            no_cvm = paddle.static.nn.continuous_value_model(x, u, True)
            static_ret1 = self.get_static_graph_result(
                feed={'data': inp, 'show_click': show_clk},
                fetch_list=[no_cvm],
            )[0]
        with self.static_graph():
            x = paddle.static.data(
                name='data',
                shape=[10, 10],
                dtype='float32',
            )
            u = paddle.static.data(
                name='show_click',
                shape=[10, 2],
                dtype='float32',
            )
            cvm = paddle.static.nn.continuous_value_model(x, u, False)
            static_ret2 = self.get_static_graph_result(
                feed={'data': inp, 'show_click': show_clk}, fetch_list=[cvm]
            )[0]
        np.testing.assert_allclose(static_ret1, cvm1, rtol=1e-5, atol=1e-06)
        np.testing.assert_allclose(static_ret2, cvm2, rtol=1e-5, atol=1e-06)

225 226 227
    def test_Flatten(self):
        inp = np.ones([3, 4, 4, 5], dtype='float32')
        with self.static_graph():
228 229 230 231 232 233
            t = layers.data(
                name='data',
                shape=[3, 4, 4, 5],
                dtype='float32',
                append_batch_size=False,
            )
234
            flatten = paddle.nn.Flatten()
235
            ret = flatten(t)
236 237 238
            static_ret = self.get_static_graph_result(
                feed={'data': inp}, fetch_list=[ret]
            )[0]
239
        with self.dynamic_graph():
240 241
            with _test_eager_guard():
                t = base.to_variable(inp)
242
                flatten = paddle.nn.Flatten()
243 244 245
                dy_eager_ret = flatten(t)
                dy_eager_ret_value = dy_eager_ret.numpy()

246
            t = base.to_variable(inp)
247
            flatten = paddle.nn.Flatten()
248 249 250
            dy_ret = flatten(t)
            dy_ret_value = dy_ret.numpy()

251 252
        np.testing.assert_array_equal(static_ret, dy_eager_ret_value)
        np.testing.assert_array_equal(static_ret, dy_ret_value)
253 254 255 256 257 258

        with self.static_graph():

            # the input of Linear must be Variable.
            def test_Variable():
                inp = np.ones([3, 32, 32], dtype='float32')
259
                linear = paddle.nn.Linear(
260 261
                    32,
                    4,
262 263
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
264 265 266 267 268 269 270 271
                linear_ret1 = linear(inp)

            self.assertRaises(TypeError, test_Variable)

            # the input dtype of Linear must be float16 or float32 or float64
            # float16 only can be set on GPU place
            def test_type():
                inp = np.ones([3, 32, 32], dtype='int32')
272
                linear = paddle.nn.Linear(
273 274
                    32,
                    4,
275 276
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
277 278 279 280
                linear_ret2 = linear(inp)

            self.assertRaises(TypeError, test_type)

C
ceci3 已提交
281 282 283 284
    def test_SyncBatchNorm(self):
        if core.is_compiled_with_cuda():
            with self.static_graph():
                t = layers.data(name='t', shape=[-1, 3, 5, 5], dtype='float32')
C
ceci3 已提交
285
                my_sync_bn = paddle.nn.SyncBatchNorm(3)
C
ceci3 已提交
286 287
                ret = my_sync_bn(t)
                static_ret = self.get_static_graph_result(
288
                    feed={'t': np.ones([3, 3, 5, 5], dtype='float32')},
289 290
                    fetch_list=[ret],
                )[0]
C
ceci3 已提交
291 292

            with self.dynamic_graph():
293 294 295 296 297 298
                with _test_eager_guard():
                    t = np.ones([3, 3, 5, 5], dtype='float32')
                    my_syncbn = paddle.nn.SyncBatchNorm(3)
                    dy_eager_ret = my_syncbn(base.to_variable(t))
                    dy_eager_ret_value = dy_eager_ret.numpy()

C
ceci3 已提交
299 300 301 302
                t = np.ones([3, 3, 5, 5], dtype='float32')
                my_syncbn = paddle.nn.SyncBatchNorm(3)
                dy_ret = my_syncbn(base.to_variable(t))
                dy_ret_value = dy_ret.numpy()
303 304
            np.testing.assert_array_equal(static_ret, dy_ret_value)
            np.testing.assert_array_equal(static_ret, dy_eager_ret_value)
C
ceci3 已提交
305

306 307 308 309 310
    def test_relu(self):
        with self.static_graph():
            t = layers.data(name='t', shape=[3, 3], dtype='float32')
            ret = layers.relu(t)
            static_ret = self.get_static_graph_result(
311 312
                feed={'t': np.ones([3, 3], dtype='float32')}, fetch_list=[ret]
            )[0]
313 314

        with self.dynamic_graph():
315 316 317 318 319
            with _test_eager_guard():
                t = np.ones([3, 3], dtype='float32')
                dy_eager_ret = layers.relu(base.to_variable(t))
                dy_eager_ret_value = dy_eager_ret.numpy()

320 321
            t = np.ones([3, 3], dtype='float32')
            dy_ret = layers.relu(base.to_variable(t))
322
            dy_ret_value = dy_ret.numpy()
323

324 325
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_ret_value, rtol=1e-05)
C
ceci3 已提交
326

327 328 329 330
    def test_matmul(self):
        with self.static_graph():
            t = layers.data(name='t', shape=[3, 3], dtype='float32')
            t2 = layers.data(name='t2', shape=[3, 3], dtype='float32')
K
kangguangli 已提交
331
            ret = paddle.matmul(t, t2)
332 333 334 335 336 337 338
            static_ret = self.get_static_graph_result(
                feed={
                    't': np.ones([3, 3], dtype='float32'),
                    't2': np.ones([3, 3], dtype='float32'),
                },
                fetch_list=[ret],
            )[0]
339 340

        with self.dynamic_graph():
341 342 343
            with _test_eager_guard():
                t = np.ones([3, 3], dtype='float32')
                t2 = np.ones([3, 3], dtype='float32')
K
kangguangli 已提交
344
                dy_eager_ret = paddle.matmul(
345 346
                    base.to_variable(t), base.to_variable(t2)
                )
347 348
                dy_eager_ret_value = dy_eager_ret.numpy()

349 350
            t = np.ones([3, 3], dtype='float32')
            t2 = np.ones([3, 3], dtype='float32')
K
kangguangli 已提交
351
            dy_ret = paddle.matmul(base.to_variable(t), base.to_variable(t2))
352
            dy_ret_value = dy_ret.numpy()
353

354 355
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_ret_value, rtol=1e-05)
356

X
Xin Pan 已提交
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
    def test_elementwise_math(self):
        n = np.ones([3, 3], dtype='float32')
        n2 = np.ones([3, 3], dtype='float32') * 1.1
        n3 = np.ones([3, 3], dtype='float32') * 2
        n4 = np.ones([3, 3], dtype='float32') * 3
        n5 = np.ones([3, 3], dtype='float32') * 4
        n6 = np.ones([3, 3], dtype='float32') * 5

        with self.static_graph():
            t = layers.data(name='t', shape=[3, 3], dtype='float32')
            t2 = layers.data(name='t2', shape=[3, 3], dtype='float32')
            t3 = layers.data(name='t3', shape=[3, 3], dtype='float32')
            t4 = layers.data(name='t4', shape=[3, 3], dtype='float32')
            t5 = layers.data(name='t5', shape=[3, 3], dtype='float32')
            t6 = layers.data(name='t6', shape=[3, 3], dtype='float32')

373
            ret = paddle.add(t, t2)
374
            ret = paddle.pow(ret, t3)
375 376 377
            ret = paddle.divide(ret, t4)
            ret = paddle.subtract(ret, t5)
            ret = paddle.multiply(ret, t6)
X
Xin Pan 已提交
378

379 380 381 382
            static_ret = self.get_static_graph_result(
                feed={'t': n, 't2': n2, 't3': n3, 't4': n4, 't5': n5, 't6': n6},
                fetch_list=[ret],
            )[0]
X
Xin Pan 已提交
383 384

        with self.dynamic_graph():
385
            with _test_eager_guard():
386
                ret = paddle.add(to_variable(n), to_variable(n2))
387
                ret = paddle.pow(ret, to_variable(n3))
388 389 390
                ret = paddle.divide(ret, to_variable(n4))
                ret = paddle.subtract(ret, to_variable(n5))
                dy_eager_ret = paddle.multiply(ret, to_variable(n6))
391 392
                dy_eager_ret_value = dy_eager_ret.numpy()

393
            ret = paddle.add(to_variable(n), to_variable(n2))
394
            ret = paddle.pow(ret, to_variable(n3))
395 396 397
            ret = paddle.divide(ret, to_variable(n4))
            ret = paddle.subtract(ret, to_variable(n5))
            dy_ret = paddle.multiply(ret, to_variable(n6))
398
            dy_ret_value = dy_ret.numpy()
399

400 401
        np.testing.assert_allclose(static_ret, dy_ret_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_ret_value, rtol=1e-05)
X
Xin Pan 已提交
402 403 404 405 406 407

    def test_elementwise_minmax(self):
        n = np.ones([3, 3], dtype='float32')
        n2 = np.ones([3, 3], dtype='float32') * 2

        with self.dynamic_graph():
408
            with _test_eager_guard():
409
                min_eager_ret = paddle.minimum(to_variable(n), to_variable(n2))
H
HongyuJia 已提交
410
                max_eager_ret = paddle.maximum(to_variable(n), to_variable(n2))
411 412 413
                min_eager_ret_value = min_eager_ret.numpy()
                max_eager_ret_value = max_eager_ret.numpy()

414
            min_ret = paddle.minimum(to_variable(n), to_variable(n2))
H
HongyuJia 已提交
415
            max_ret = paddle.maximum(to_variable(n), to_variable(n2))
416 417
            min_ret_value = min_ret.numpy()
            max_ret_value = max_ret.numpy()
X
Xin Pan 已提交
418

419 420 421 422
        np.testing.assert_allclose(n, min_ret_value, rtol=1e-05)
        np.testing.assert_allclose(n2, max_ret_value, rtol=1e-05)
        np.testing.assert_allclose(n, min_eager_ret_value, rtol=1e-05)
        np.testing.assert_allclose(n2, max_eager_ret_value, rtol=1e-05)
X
Xin Pan 已提交
423

424 425 426 427
    def test_conv2d_transpose(self):
        inp_np = np.arange(0, 24).reshape([2, 3, 2, 2]).astype('float32')
        with self.static_graph():
            img = layers.data(name='pixel', shape=[3, 2, 2], dtype='float32')
428
            out = paddle.static.nn.conv2d_transpose(
429 430
                input=img,
                num_filters=10,
431
                filter_size=27,
432
                act='sigmoid',
433 434 435 436 437
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
            static_rlt = self.get_static_graph_result(
                feed={'pixel': inp_np}, fetch_list=[out]
            )[0]
438 439
        with self.static_graph():
            img = layers.data(name='pixel', shape=[3, 2, 2], dtype='float32')
440 441 442 443
            conv2d_transpose = paddle.nn.Conv2DTranspose(
                3,
                10,
                27,
444 445
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
446
            out = conv2d_transpose(img)
447
            out = paddle.nn.functional.sigmoid(out)
448 449 450
            static_rlt2 = self.get_static_graph_result(
                feed={'pixel': inp_np}, fetch_list=[out]
            )[0]
451
        with self.dynamic_graph():
452
            with _test_eager_guard():
453 454 455 456
                conv2d_transpose = paddle.nn.Conv2DTranspose(
                    3,
                    10,
                    27,
457 458
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
                )
459
                dy_eager_rlt = conv2d_transpose(base.to_variable(inp_np))
460
                dy_eager_rlt = paddle.nn.functional.sigmoid(dy_eager_rlt)
461 462
                dy_eager_rlt_value = dy_eager_rlt.numpy()

463 464 465 466
            conv2d_transpose = paddle.nn.Conv2DTranspose(
                3,
                10,
                27,
467 468
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
469
            dy_rlt = conv2d_transpose(base.to_variable(inp_np))
470
            dy_rlt = paddle.nn.functional.sigmoid(dy_rlt)
471
            dy_rlt_value = dy_rlt.numpy()
472 473 474
        np.testing.assert_allclose(static_rlt2, static_rlt, rtol=1e-05)
        np.testing.assert_allclose(dy_rlt_value, static_rlt2, rtol=1e-05)
        np.testing.assert_allclose(dy_eager_rlt_value, static_rlt2, rtol=1e-05)
475

476
        with self.dynamic_graph():
477 478 479 480 481
            with _test_eager_guard():
                images = np.ones([2, 3, 5, 5], dtype='float32')
                custom_weight = np.random.randn(3, 3, 2, 2).astype("float32")
                weight_attr = fluid.ParamAttr(
                    initializer=fluid.initializer.NumpyArrayInitializer(
482 483 484
                        custom_weight
                    )
                )
485 486 487 488 489 490
                conv2d1 = paddle.nn.Conv2DTranspose(3, 3, [2, 2])
                conv2d2 = paddle.nn.Conv2DTranspose(
                    3,
                    3,
                    [2, 2],
                    weight_attr=weight_attr,
491
                )
492 493 494
                dy_ret1 = conv2d1(base.to_variable(images))
                dy_ret2 = conv2d2(base.to_variable(images))
                self.assertFalse(
495 496
                    np.array_equal(dy_ret1.numpy(), dy_ret2.numpy())
                )
497 498 499 500

                conv2d1_weight_np = conv2d1.weight.numpy()
                conv2d1_bias = conv2d1.bias
                self.assertFalse(
501 502
                    np.array_equal(conv2d1_weight_np, conv2d2.weight.numpy())
                )
503
                conv2d2.weight.set_value(conv2d1_weight_np)
504 505 506
                np.testing.assert_array_equal(
                    conv2d1_weight_np, conv2d2.weight.numpy()
                )
507 508 509
                conv2d2.bias.set_value(conv2d1_bias)
                dy_ret1 = conv2d1(base.to_variable(images))
                dy_ret2 = conv2d2(base.to_variable(images))
510
                np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
511 512 513

                conv2d2.weight = conv2d1.weight
                conv2d2.bias = conv2d1.bias
514 515 516 517 518 519
                np.testing.assert_array_equal(
                    conv2d1.weight.numpy(), conv2d2.weight.numpy()
                )
                np.testing.assert_array_equal(
                    conv2d1.bias.numpy(), conv2d2.bias.numpy()
                )
520

521 522
            images = np.ones([2, 3, 5, 5], dtype='float32')
            custom_weight = np.random.randn(3, 3, 2, 2).astype("float32")
523 524 525 526 527
            weight_attr = fluid.ParamAttr(
                initializer=fluid.initializer.NumpyArrayInitializer(
                    custom_weight
                )
            )
528 529 530 531 532 533
            conv2d1 = paddle.nn.Conv2DTranspose(3, 3, [2, 2])
            conv2d2 = paddle.nn.Conv2DTranspose(
                3,
                3,
                [2, 2],
                weight_attr=weight_attr,
534
            )
535 536 537 538 539 540 541
            dy_ret1 = conv2d1(base.to_variable(images))
            dy_ret2 = conv2d2(base.to_variable(images))
            self.assertFalse(np.array_equal(dy_ret1.numpy(), dy_ret2.numpy()))

            conv2d1_weight_np = conv2d1.weight.numpy()
            conv2d1_bias = conv2d1.bias
            self.assertFalse(
542 543
                np.array_equal(conv2d1_weight_np, conv2d2.weight.numpy())
            )
544
            conv2d2.weight.set_value(conv2d1_weight_np)
545 546 547
            np.testing.assert_array_equal(
                conv2d1_weight_np, conv2d2.weight.numpy()
            )
548 549 550
            conv2d2.bias.set_value(conv2d1_bias)
            dy_ret1 = conv2d1(base.to_variable(images))
            dy_ret2 = conv2d2(base.to_variable(images))
551
            np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
552 553 554

            conv2d2.weight = conv2d1.weight
            conv2d2.bias = conv2d1.bias
555 556 557 558 559 560
            np.testing.assert_array_equal(
                conv2d1.weight.numpy(), conv2d2.weight.numpy()
            )
            np.testing.assert_array_equal(
                conv2d1.bias.numpy(), conv2d2.bias.numpy()
            )
561

562 563 564 565 566
        with self.static_graph():

            # the input of Conv2DTranspose must be Variable.
            def test_Variable():
                images = np.ones([2, 3, 5, 5], dtype='float32')
567
                conv2d = paddle.nn.Conv2DTranspose(3, 3, [2, 2])
568 569 570 571 572 573 574
                conv2d_ret1 = conv2d(images)

            self.assertRaises(TypeError, test_Variable)

            # the input dtype of Conv2DTranspose must be float16 or float32 or float64
            # float16 only can be set on GPU place
            def test_type():
575 576 577
                images = layers.data(
                    name='pixel', shape=[3, 5, 5], dtype='int32'
                )
578
                conv2d = paddle.nn.Conv2DTranspose(3, 3, [2, 2])
579 580 581 582
                conv2d_ret2 = conv2d(images)

            self.assertRaises(TypeError, test_type)

583 584 585 586 587
    def test_bilinear_tensor_product(self):
        inp_np_x = np.array([[1, 2, 3]]).astype('float32')
        inp_np_y = np.array([[4, 5, 6]]).astype('float32')

        with self.static_graph():
588 589 590 591 592 593
            data_x = layers.data(
                name='x', shape=[1, 3], dtype="float32", append_batch_size=False
            )
            data_y = layers.data(
                name='y', shape=[1, 3], dtype="float32", append_batch_size=False
            )
594
            out = paddle.static.nn.common.bilinear_tensor_product(
595 596 597 598
                data_x,
                data_y,
                6,
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
599 600
                act='sigmoid',
            )
601

602 603 604
            static_rlt = self.get_static_graph_result(
                feed={'x': inp_np_x, 'y': inp_np_y}, fetch_list=[out]
            )[0]
605

606
        with self.static_graph():
607 608 609 610 611 612
            data_x = layers.data(
                name='x', shape=[1, 3], dtype="float32", append_batch_size=False
            )
            data_y = layers.data(
                name='y', shape=[1, 3], dtype="float32", append_batch_size=False
            )
613
            btp = paddle.nn.Bilinear(
614 615
                3,
                3,
616 617
                6,
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
618
            )
619
            out = btp(data_x, data_y)
620
            out = paddle.nn.functional.sigmoid(out)
621 622 623
            static_rlt2 = self.get_static_graph_result(
                feed={'x': inp_np_x, 'y': inp_np_y}, fetch_list=[out]
            )[0]
624
        with self.dynamic_graph():
625
            with _test_eager_guard():
626
                btp = paddle.nn.Bilinear(
627 628 629 630
                    3,
                    3,
                    6,
                    bias_attr=fluid.initializer.ConstantInitializer(value=1),
631 632 633 634
                )
                dy_eager_rlt = btp(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
635
                dy_eager_rlt = paddle.nn.functional.sigmoid(dy_eager_rlt)
636 637
                dy_eager_rlt_value = dy_eager_rlt.numpy()

638
            btp = paddle.nn.Bilinear(
639 640
                3,
                3,
641 642
                6,
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
643
            )
644
            dy_rlt = btp(base.to_variable(inp_np_x), base.to_variable(inp_np_y))
645
            dy_rlt = paddle.nn.functional.sigmoid(dy_rlt)
646
            dy_rlt_value = dy_rlt.numpy()
647

648
        with self.dynamic_graph():
649
            with _test_eager_guard():
650
                btp2 = paddle.nn.Bilinear(3, 3, 6)
651 652 653
                dy_eager_rlt2 = btp2(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
654
                dy_eager_rlt2 = paddle.nn.functional.sigmoid(dy_eager_rlt2)
655 656
                dy_eager_rlt2_value = dy_eager_rlt2.numpy()

657
            btp2 = paddle.nn.Bilinear(3, 3, 6)
658 659 660
            dy_rlt2 = btp2(
                base.to_variable(inp_np_x), base.to_variable(inp_np_y)
            )
661
            dy_rlt2 = paddle.nn.functional.sigmoid(dy_rlt2)
662
            dy_rlt2_value = dy_rlt2.numpy()
663

664
        with self.static_graph():
665 666 667 668 669 670
            data_x2 = layers.data(
                name='x', shape=[1, 3], dtype="float32", append_batch_size=False
            )
            data_y2 = layers.data(
                name='y', shape=[1, 3], dtype="float32", append_batch_size=False
            )
671
            out2 = paddle.static.nn.common.bilinear_tensor_product(
672 673 674 675 676 677
                data_x2, data_y2, 6, act='sigmoid'
            )

            static_rlt3 = self.get_static_graph_result(
                feed={'x': inp_np_x, 'y': inp_np_y}, fetch_list=[out2]
            )[0]
678

679 680 681 682 683
        np.testing.assert_array_equal(dy_rlt2_value, static_rlt3)
        np.testing.assert_array_equal(dy_eager_rlt2_value, static_rlt3)
        np.testing.assert_array_equal(static_rlt2, static_rlt)
        np.testing.assert_array_equal(dy_rlt_value, static_rlt)
        np.testing.assert_array_equal(dy_eager_rlt_value, static_rlt)
684

685
        with self.dynamic_graph():
686 687 688 689
            with _test_eager_guard():
                custom_weight = np.random.randn(6, 3, 3).astype("float32")
                weight_attr = fluid.ParamAttr(
                    initializer=fluid.initializer.NumpyArrayInitializer(
690 691 692
                        custom_weight
                    )
                )
693 694
                btp1 = paddle.nn.Bilinear(3, 3, 6)
                btp2 = paddle.nn.Bilinear(3, 3, 6, weight_attr=weight_attr)
695 696 697
                dy_rlt1 = btp1(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
698
                dy_rlt1 = paddle.nn.functional.sigmoid(dy_rlt1)
699 700 701
                dy_rlt2 = btp2(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
702
                dy_rlt2 = paddle.nn.functional.sigmoid(dy_rlt2)
703
                self.assertFalse(
704 705
                    np.array_equal(dy_rlt1.numpy(), dy_rlt2.numpy())
                )
706 707
                btp2.weight.set_value(btp1.weight.numpy())
                btp2.bias.set_value(btp1.bias)
708 709 710 711 712 713
                dy_rlt1 = btp1(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
                dy_rlt2 = btp2(
                    base.to_variable(inp_np_x), base.to_variable(inp_np_y)
                )
714
                np.testing.assert_array_equal(dy_rlt1.numpy(), dy_rlt2.numpy())
715 716 717

                btp2.weight = btp1.weight
                btp2.bias = btp1.bias
718 719 720 721 722 723
                np.testing.assert_array_equal(
                    btp1.weight.numpy(), btp2.weight.numpy()
                )
                np.testing.assert_array_equal(
                    btp1.bias.numpy(), btp2.bias.numpy()
                )
724

725
            custom_weight = np.random.randn(6, 3, 3).astype("float32")
726 727 728 729 730
            weight_attr = fluid.ParamAttr(
                initializer=fluid.initializer.NumpyArrayInitializer(
                    custom_weight
                )
            )
731 732
            btp1 = paddle.nn.Bilinear(3, 3, 6)
            btp2 = paddle.nn.Bilinear(3, 3, 6, weight_attr=weight_attr)
733 734 735
            dy_rlt1 = btp1(
                base.to_variable(inp_np_x), base.to_variable(inp_np_y)
            )
736
            dy_rlt1 = paddle.nn.functional.sigmoid(dy_rlt1)
737 738 739
            dy_rlt2 = btp2(
                base.to_variable(inp_np_x), base.to_variable(inp_np_y)
            )
740
            dy_rlt2 = paddle.nn.functional.sigmoid(dy_rlt2)
741 742 743
            self.assertFalse(np.array_equal(dy_rlt1.numpy(), dy_rlt2.numpy()))
            btp2.weight.set_value(btp1.weight.numpy())
            btp2.bias.set_value(btp1.bias)
744 745 746 747 748 749
            dy_rlt1 = btp1(
                base.to_variable(inp_np_x), base.to_variable(inp_np_y)
            )
            dy_rlt2 = btp2(
                base.to_variable(inp_np_x), base.to_variable(inp_np_y)
            )
750
            np.testing.assert_array_equal(dy_rlt1.numpy(), dy_rlt2.numpy())
751 752 753

            btp2.weight = btp1.weight
            btp2.bias = btp1.bias
754 755 756
            np.testing.assert_array_equal(
                btp1.weight.numpy(), btp2.weight.numpy()
            )
757
            np.testing.assert_array_equal(btp1.bias.numpy(), btp2.bias.numpy())
758

759 760 761 762 763
    def test_embeding(self):
        inp_word = np.array([[[1]]]).astype('int64')
        dict_size = 20
        with self.static_graph():
            data_t = layers.data(name='word', shape=[1], dtype='int64')
764 765 766 767 768 769 770 771 772
            emb = layers.embedding(
                input=data_t,
                size=[dict_size, 32],
                param_attr='emb.w',
                is_sparse=False,
            )
            static_rlt = self.get_static_graph_result(
                feed={'word': inp_word}, fetch_list=[emb]
            )[0]
773 774
        with self.static_graph():
            data_t = layers.data(name='word', shape=[1], dtype='int64')
775 776
            emb2 = paddle.nn.Embedding(
                dict_size, 32, weight_attr='emb.w', sparse=False
777
            )
778
            emb_rlt = emb2(data_t)
779 780 781
            static_rlt2 = self.get_static_graph_result(
                feed={'word': inp_word}, fetch_list=[emb_rlt]
            )[0]
782
        with self.dynamic_graph():
783
            with _test_eager_guard():
784 785 786 787 788
                emb2 = paddle.nn.Embedding(
                    dict_size,
                    32,
                    weight_attr='eager_emb.w',
                    sparse=False,
789
                )
790 791 792
                dy_eager_rlt = emb2(base.to_variable(inp_word))
                dy_eager_rlt_value = dy_eager_rlt.numpy()

793 794
            emb2 = paddle.nn.Embedding(
                dict_size, 32, weight_attr='emb.w', sparse=False
795
            )
796 797
            dy_rlt = emb2(base.to_variable(inp_word))
            dy_rlt_value = dy_rlt.numpy()
798 799

        self.assertTrue(np.allclose(static_rlt2, static_rlt))
800
        self.assertTrue(np.allclose(dy_rlt_value, static_rlt))
801
        self.assertTrue(np.allclose(dy_eager_rlt_value, static_rlt))
802

803
        with self.dynamic_graph():
804 805 806 807
            with _test_eager_guard():
                custom_weight = np.random.randn(dict_size, 32).astype("float32")
                weight_attr = fluid.ParamAttr(
                    initializer=fluid.initializer.NumpyArrayInitializer(
808 809 810
                        custom_weight
                    )
                )
811 812 813 814 815 816
                emb1 = paddle.nn.Embedding(dict_size, 32, sparse=False)
                emb2 = paddle.nn.Embedding(
                    dict_size,
                    32,
                    weight_attr=weight_attr,
                    sparse=False,
817
                )
818 819 820
                rep1 = emb1(base.to_variable(inp_word))
                rep2 = emb2(base.to_variable(inp_word))
                self.assertFalse(
821 822 823 824 825
                    np.array_equal(emb1.weight.numpy(), custom_weight)
                )
                np.testing.assert_array_equal(
                    emb2.weight.numpy(), custom_weight
                )
826 827 828
                self.assertFalse(np.array_equal(rep1.numpy(), rep2.numpy()))
                emb2.weight.set_value(emb1.weight.numpy())
                rep2 = emb2(base.to_variable(inp_word))
829
                np.testing.assert_array_equal(rep1.numpy(), rep2.numpy())
830 831

                emb2.weight = emb1.weight
832 833 834
                np.testing.assert_array_equal(
                    emb1.weight.numpy(), emb2.weight.numpy()
                )
835

836
            custom_weight = np.random.randn(dict_size, 32).astype("float32")
837 838 839 840 841
            weight_attr = fluid.ParamAttr(
                initializer=fluid.initializer.NumpyArrayInitializer(
                    custom_weight
                )
            )
842 843 844
            emb1 = paddle.nn.Embedding(dict_size, 32, sparse=False)
            emb2 = paddle.nn.Embedding(
                dict_size, 32, weight_attr=weight_attr, sparse=False
845
            )
846 847 848
            rep1 = emb1(base.to_variable(inp_word))
            rep2 = emb2(base.to_variable(inp_word))
            self.assertFalse(np.array_equal(emb1.weight.numpy(), custom_weight))
849
            np.testing.assert_array_equal(emb2.weight.numpy(), custom_weight)
850 851 852
            self.assertFalse(np.array_equal(rep1.numpy(), rep2.numpy()))
            emb2.weight.set_value(emb1.weight.numpy())
            rep2 = emb2(base.to_variable(inp_word))
853
            np.testing.assert_array_equal(rep1.numpy(), rep2.numpy())
854 855

            emb2.weight = emb1.weight
856 857 858
            np.testing.assert_array_equal(
                emb1.weight.numpy(), emb2.weight.numpy()
            )
859

S
songyouwei 已提交
860 861
    def test_one_hot(self):
        with self.dynamic_graph():
862
            with _test_eager_guard():
863 864 865
                label = fluid.dygraph.to_variable(
                    np.array([[1], [1], [3], [0]])
                )
866 867
                one_hot_label1 = fluid.layers.one_hot(input=label, depth=4)
                one_hot_label2 = fluid.layers.one_hot(
868 869 870 871 872
                    input=label, depth=fluid.dygraph.to_variable(np.array([4]))
                )
                np.testing.assert_array_equal(
                    one_hot_label1.numpy(), one_hot_label2.numpy()
                )
873

S
songyouwei 已提交
874 875 876
            label = fluid.dygraph.to_variable(np.array([[1], [1], [3], [0]]))
            one_hot_label1 = fluid.layers.one_hot(input=label, depth=4)
            one_hot_label2 = fluid.layers.one_hot(
877 878 879 880 881
                input=label, depth=fluid.dygraph.to_variable(np.array([4]))
            )
            np.testing.assert_array_equal(
                one_hot_label1.numpy(), one_hot_label2.numpy()
            )
S
songyouwei 已提交
882 883 884

    def test_split(self):
        with self.dynamic_graph():
885 886 887
            with _test_eager_guard():
                input = fluid.dygraph.to_variable(np.random.random((3, 8, 5)))
                x0, x1 = fluid.layers.split(input, num_or_sections=2, dim=1)
888 889 890 891 892
                x00, x11 = fluid.layers.split(
                    input,
                    num_or_sections=2,
                    dim=fluid.dygraph.to_variable(np.array([1])),
                )
893 894
                np.testing.assert_array_equal(x0.numpy(), x00.numpy())
                np.testing.assert_array_equal(x1.numpy(), x11.numpy())
895

S
songyouwei 已提交
896 897
            input = fluid.dygraph.to_variable(np.random.random((3, 8, 5)))
            x0, x1 = fluid.layers.split(input, num_or_sections=2, dim=1)
898 899 900 901 902
            x00, x11 = fluid.layers.split(
                input,
                num_or_sections=2,
                dim=fluid.dygraph.to_variable(np.array([1])),
            )
903 904
            np.testing.assert_array_equal(x0.numpy(), x00.numpy())
            np.testing.assert_array_equal(x1.numpy(), x11.numpy())
S
songyouwei 已提交
905 906 907

    def test_topk(self):
        with self.dynamic_graph():
908 909
            with _test_eager_guard():
                input = fluid.dygraph.to_variable(np.random.random((13, 11)))
910 911
                top5_values1, top5_indices1 = paddle.topk(input, k=5)
                top5_values2, top5_indices2 = paddle.topk(
912 913 914 915 916 917 918 919
                    input, k=fluid.dygraph.to_variable(np.array([5]))
                )
                np.testing.assert_array_equal(
                    top5_values1.numpy(), top5_values2.numpy()
                )
                np.testing.assert_array_equal(
                    top5_indices1.numpy(), top5_indices2.numpy()
                )
920

S
songyouwei 已提交
921
            input = fluid.dygraph.to_variable(np.random.random((13, 11)))
922 923
            top5_values1, top5_indices1 = paddle.topk(input, k=5)
            top5_values2, top5_indices2 = paddle.topk(
924 925 926 927 928 929 930 931
                input, k=fluid.dygraph.to_variable(np.array([5]))
            )
            np.testing.assert_array_equal(
                top5_values1.numpy(), top5_values2.numpy()
            )
            np.testing.assert_array_equal(
                top5_indices1.numpy(), top5_indices2.numpy()
            )
S
songyouwei 已提交
932

L
lujun 已提交
933 934
    def test_conv3d(self):
        with self.static_graph():
935 936 937
            images = layers.data(
                name='pixel', shape=[3, 6, 6, 6], dtype='float32'
            )
938 939 940
            ret = paddle.static.nn.conv3d(
                input=images, num_filters=3, filter_size=2
            )
L
lujun 已提交
941
            static_ret = self.get_static_graph_result(
942
                feed={'pixel': np.ones([2, 3, 6, 6, 6], dtype='float32')},
943 944
                fetch_list=[ret],
            )[0]
L
lujun 已提交
945 946

        with self.static_graph():
947 948 949
            images = layers.data(
                name='pixel', shape=[3, 6, 6, 6], dtype='float32'
            )
950 951 952
            conv3d = paddle.nn.Conv3D(
                in_channels=3, out_channels=3, kernel_size=2
            )
L
lujun 已提交
953 954
            ret = conv3d(images)
            static_ret2 = self.get_static_graph_result(
955
                feed={'pixel': np.ones([2, 3, 6, 6, 6], dtype='float32')},
956 957
                fetch_list=[ret],
            )[0]
L
lujun 已提交
958 959

        with self.dynamic_graph():
960 961
            with _test_eager_guard():
                images = np.ones([2, 3, 6, 6, 6], dtype='float32')
962 963 964
                conv3d = paddle.nn.Conv3D(
                    in_channels=3, out_channels=3, kernel_size=2
                )
965 966 967
                dy_eager_ret = conv3d(base.to_variable(images))
                dy_eager_rlt_value = dy_eager_ret.numpy()

L
lujun 已提交
968
            images = np.ones([2, 3, 6, 6, 6], dtype='float32')
969 970 971
            conv3d = paddle.nn.Conv3D(
                in_channels=3, out_channels=3, kernel_size=2
            )
L
lujun 已提交
972
            dy_ret = conv3d(base.to_variable(images))
973
            dy_rlt_value = dy_ret.numpy()
L
lujun 已提交
974

975 976 977
        np.testing.assert_allclose(static_ret, dy_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, static_ret2, rtol=1e-05)
L
lujun 已提交
978

979
        with self.dynamic_graph():
980 981 982 983 984
            with _test_eager_guard():
                images = np.ones([2, 3, 6, 6, 6], dtype='float32')
                custom_weight = np.random.randn(3, 3, 2, 2, 2).astype("float32")
                weight_attr = fluid.ParamAttr(
                    initializer=fluid.initializer.NumpyArrayInitializer(
985 986 987
                        custom_weight
                    )
                )
988 989
                conv3d1 = paddle.nn.Conv3D(
                    in_channels=3, out_channels=3, kernel_size=2
990
                )
991 992 993 994 995
                conv3d2 = paddle.nn.Conv3D(
                    in_channels=3,
                    out_channels=3,
                    kernel_size=2,
                    weight_attr=weight_attr,
996
                )
997 998 999
                dy_ret1 = conv3d1(base.to_variable(images))
                dy_ret2 = conv3d2(base.to_variable(images))
                self.assertFalse(
1000 1001
                    np.array_equal(dy_ret1.numpy(), dy_ret2.numpy())
                )
1002 1003 1004 1005

                conv3d1_weight_np = conv3d1.weight.numpy()
                conv3d1_bias = conv3d1.bias
                self.assertFalse(
1006 1007
                    np.array_equal(conv3d1_weight_np, conv3d2.weight.numpy())
                )
1008
                conv3d2.weight.set_value(conv3d1_weight_np)
1009 1010 1011
                np.testing.assert_array_equal(
                    conv3d1_weight_np, conv3d2.weight.numpy()
                )
1012 1013 1014
                conv3d1.bias.set_value(conv3d1_bias)
                dy_ret1 = conv3d1(base.to_variable(images))
                dy_ret2 = conv3d2(base.to_variable(images))
1015
                np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
1016 1017 1018

                conv3d2.weight = conv3d1.weight
                conv3d2.bias = conv3d1.bias
1019 1020 1021 1022 1023 1024
                np.testing.assert_array_equal(
                    conv3d1.weight.numpy(), conv3d2.weight.numpy()
                )
                np.testing.assert_array_equal(
                    conv3d1.bias.numpy(), conv3d2.bias.numpy()
                )
1025

1026 1027
            images = np.ones([2, 3, 6, 6, 6], dtype='float32')
            custom_weight = np.random.randn(3, 3, 2, 2, 2).astype("float32")
1028 1029 1030 1031 1032
            weight_attr = fluid.ParamAttr(
                initializer=fluid.initializer.NumpyArrayInitializer(
                    custom_weight
                )
            )
1033 1034 1035 1036 1037 1038 1039 1040
            conv3d1 = paddle.nn.Conv3D(
                in_channels=3, out_channels=3, kernel_size=2
            )
            conv3d2 = paddle.nn.Conv3D(
                in_channels=3,
                out_channels=3,
                kernel_size=2,
                weight_attr=weight_attr,
1041
            )
1042 1043 1044 1045 1046 1047 1048
            dy_ret1 = conv3d1(base.to_variable(images))
            dy_ret2 = conv3d2(base.to_variable(images))
            self.assertFalse(np.array_equal(dy_ret1.numpy(), dy_ret2.numpy()))

            conv3d1_weight_np = conv3d1.weight.numpy()
            conv3d1_bias = conv3d1.bias
            self.assertFalse(
1049 1050
                np.array_equal(conv3d1_weight_np, conv3d2.weight.numpy())
            )
1051
            conv3d2.weight.set_value(conv3d1_weight_np)
1052 1053 1054
            np.testing.assert_array_equal(
                conv3d1_weight_np, conv3d2.weight.numpy()
            )
1055 1056 1057
            conv3d1.bias.set_value(conv3d1_bias)
            dy_ret1 = conv3d1(base.to_variable(images))
            dy_ret2 = conv3d2(base.to_variable(images))
1058
            np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
1059 1060 1061

            conv3d2.weight = conv3d1.weight
            conv3d2.bias = conv3d1.bias
1062 1063 1064 1065 1066 1067
            np.testing.assert_array_equal(
                conv3d1.weight.numpy(), conv3d2.weight.numpy()
            )
            np.testing.assert_array_equal(
                conv3d1.bias.numpy(), conv3d2.bias.numpy()
            )
1068

1069
    def func_group_norm(self):
L
lujun 已提交
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
        else:
            place = core.CPUPlace()

        shape = (2, 4, 3, 3)

        input = np.random.random(shape).astype('float32')

        with self.static_graph():
1080 1081 1082 1083 1084 1085 1086
            X = fluid.layers.data(
                name='X',
                shape=shape,
                dtype='float32',
                lod_level=1,
                append_batch_size=False,
            )
1087
            ret = paddle.static.nn.group_norm(
1088 1089
                input=X,
                groups=2,
1090
                param_attr=fluid.initializer.Uniform(low=-0.5, high=0.5),
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
            static_ret = self.get_static_graph_result(
                feed={
                    'X': fluid.create_lod_tensor(
                        data=input, recursive_seq_lens=[[1, 1]], place=place
                    )
                },
                fetch_list=[ret],
                with_lod=True,
            )[0]
L
lujun 已提交
1102 1103

        with self.static_graph():
1104 1105 1106 1107 1108 1109 1110
            X = fluid.layers.data(
                name='X',
                shape=shape,
                dtype='float32',
                lod_level=1,
                append_batch_size=False,
            )
1111 1112 1113 1114
            groupNorm = paddle.nn.GroupNorm(
                num_channels=shape[1],
                num_groups=2,
                weight_attr=fluid.initializer.Uniform(low=-0.5, high=0.5),
1115 1116
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
L
lujun 已提交
1117
            ret = groupNorm(X)
1118 1119 1120 1121 1122 1123 1124 1125 1126
            static_ret2 = self.get_static_graph_result(
                feed={
                    'X': fluid.create_lod_tensor(
                        data=input, recursive_seq_lens=[[1, 1]], place=place
                    )
                },
                fetch_list=[ret],
                with_lod=True,
            )[0]
L
lujun 已提交
1127 1128

        with self.dynamic_graph():
1129 1130 1131 1132
            groupNorm = paddle.nn.GroupNorm(
                num_channels=shape[1],
                num_groups=2,
                weight_attr=fluid.initializer.Uniform(low=-0.5, high=0.5),
1133 1134
                bias_attr=fluid.initializer.ConstantInitializer(value=1),
            )
L
lujun 已提交
1135
            dy_ret = groupNorm(base.to_variable(input))
1136
            dy_rlt_value = dy_ret.numpy()
L
lujun 已提交
1137

1138 1139
        np.testing.assert_allclose(static_ret, dy_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, static_ret2, rtol=1e-05)
L
lujun 已提交
1140

1141 1142 1143 1144 1145
    def test_group_norm(self):
        with _test_eager_guard():
            self.func_group_norm()
        self.func_group_norm()

1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
    def test_instance_norm(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
        else:
            place = core.CPUPlace()

        shape = (2, 4, 3, 3)

        input = np.random.random(shape).astype('float32')

        with self.static_graph():
1157 1158 1159
            X = fluid.layers.data(
                name='X', shape=shape, dtype='float32', append_batch_size=False
            )
1160
            ret = paddle.static.nn.instance_norm(input=X)
1161 1162 1163
            static_ret = self.get_static_graph_result(
                feed={'X': input}, fetch_list=[ret]
            )[0]
1164 1165

        with self.static_graph():
1166 1167 1168
            X = fluid.layers.data(
                name='X', shape=shape, dtype='float32', append_batch_size=False
            )
1169
            instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1170
            ret = instanceNorm(X)
1171 1172 1173
            static_ret2 = self.get_static_graph_result(
                feed={'X': input}, fetch_list=[ret]
            )[0]
1174 1175

        with self.dynamic_graph():
1176
            with _test_eager_guard():
1177
                instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1178 1179 1180
                dy_eager_ret = instanceNorm(base.to_variable(input))
                dy_eager_rlt_value = dy_eager_ret.numpy()

1181
            instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1182 1183 1184 1185
            dy_ret = instanceNorm(base.to_variable(input))
            dy_rlt_value = dy_ret.numpy()

        with self.dynamic_graph():
1186
            with _test_eager_guard():
1187
                instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1188 1189 1190
                dy_eager_ret = instanceNorm(base.to_variable(input))
                dy_eager_rlt_value2 = dy_eager_ret.numpy()

1191
            instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1192 1193 1194
            dy_ret = instanceNorm(base.to_variable(input))
            dy_rlt_value2 = dy_ret.numpy()

1195 1196 1197 1198 1199
        np.testing.assert_allclose(static_ret, dy_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_rlt_value2, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_rlt_value2, rtol=1e-05)
        np.testing.assert_allclose(static_ret, static_ret2, rtol=1e-05)
1200 1201 1202 1203

        with self.static_graph():
            # the input of InstanceNorm must be Variable.
            def test_Variable():
1204
                instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1205 1206 1207 1208 1209 1210 1211
                ret1 = instanceNorm(input)

            self.assertRaises(TypeError, test_Variable)

            # the input dtype of InstanceNorm must be float32 or float64
            def test_type():
                input = np.random.random(shape).astype('int32')
1212
                instanceNorm = paddle.nn.InstanceNorm2D(num_features=shape[1])
1213 1214 1215 1216
                ret2 = instanceNorm(input)

            self.assertRaises(TypeError, test_type)

L
lujun 已提交
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
    def test_spectral_norm(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
        else:
            place = core.CPUPlace()

        shape = (2, 4, 3, 3)

        input = np.random.random(shape).astype('float32')

        with self.static_graph():
1228 1229 1230 1231 1232 1233 1234
            Weight = fluid.layers.data(
                name='Weight',
                shape=shape,
                dtype='float32',
                lod_level=1,
                append_batch_size=False,
            )
L
lujun 已提交
1235
            ret = layers.spectral_norm(weight=Weight, dim=1, power_iters=2)
1236 1237 1238 1239 1240 1241 1242 1243 1244
            static_ret = self.get_static_graph_result(
                feed={
                    'Weight': fluid.create_lod_tensor(
                        data=input, recursive_seq_lens=[[1, 1]], place=place
                    ),
                },
                fetch_list=[ret],
                with_lod=True,
            )[0]
L
lujun 已提交
1245 1246

        with self.static_graph():
1247 1248 1249 1250 1251 1252 1253
            Weight = fluid.layers.data(
                name='Weight',
                shape=shape,
                dtype='float32',
                lod_level=1,
                append_batch_size=False,
            )
1254
            spectralNorm = paddle.nn.SpectralNorm(shape, axis=1, power_iters=2)
L
lujun 已提交
1255
            ret = spectralNorm(Weight)
1256 1257 1258 1259 1260 1261 1262 1263 1264
            static_ret2 = self.get_static_graph_result(
                feed={
                    'Weight': fluid.create_lod_tensor(
                        data=input, recursive_seq_lens=[[1, 1]], place=place
                    )
                },
                fetch_list=[ret],
                with_lod=True,
            )[0]
L
lujun 已提交
1265 1266

        with self.dynamic_graph():
1267
            with _test_eager_guard():
1268 1269 1270
                spectralNorm = paddle.nn.SpectralNorm(
                    shape, axis=1, power_iters=2
                )
1271 1272 1273
                dy_eager_ret = spectralNorm(base.to_variable(input))
                dy_eager_rlt_value = dy_eager_ret.numpy()

1274
            spectralNorm = paddle.nn.SpectralNorm(shape, axis=1, power_iters=2)
L
lujun 已提交
1275
            dy_ret = spectralNorm(base.to_variable(input))
1276
            dy_rlt_value = dy_ret.numpy()
L
lujun 已提交
1277

1278 1279 1280
        np.testing.assert_allclose(static_ret, dy_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, dy_eager_rlt_value, rtol=1e-05)
        np.testing.assert_allclose(static_ret, static_ret2, rtol=1e-05)
L
lujun 已提交
1281 1282

    def test_conv3d_transpose(self):
1283 1284 1285
        input_array = (
            np.arange(0, 48).reshape([2, 3, 2, 2, 2]).astype('float32')
        )
L
lujun 已提交
1286 1287 1288

        with self.static_graph():
            img = layers.data(name='pixel', shape=[3, 2, 2, 2], dtype='float32')
1289
            out = paddle.static.nn.conv3d_transpose(
1290
                input=img, num_filters=12, filter_size=12, use_cudnn=True
1291
            )
L
lujun 已提交
1292
            static_rlt = self.get_static_graph_result(
1293 1294
                feed={'pixel': input_array}, fetch_list=[out]
            )[0]
L
lujun 已提交
1295 1296
        with self.static_graph():
            img = layers.data(name='pixel', shape=[3, 2, 2, 2], dtype='float32')
1297 1298
            conv3d_transpose = paddle.nn.Conv3DTranspose(
                in_channels=3, out_channels=12, kernel_size=12
1299
            )
L
lujun 已提交
1300 1301
            out = conv3d_transpose(img)
            static_rlt2 = self.get_static_graph_result(
1302 1303
                feed={'pixel': input_array}, fetch_list=[out]
            )[0]
L
lujun 已提交
1304
        with self.dynamic_graph():
1305
            with _test_eager_guard():
1306 1307 1308 1309
                conv3d_transpose = paddle.nn.Conv3DTranspose(
                    in_channels=3,
                    out_channels=12,
                    kernel_size=12,
1310
                )
1311 1312 1313
                dy_eager_rlt = conv3d_transpose(base.to_variable(input_array))
                dy_eager_rlt_value = dy_eager_rlt.numpy()

1314 1315
            conv3d_transpose = paddle.nn.Conv3DTranspose(
                in_channels=3, out_channels=12, kernel_size=12
1316
            )
L
lujun 已提交
1317
            dy_rlt = conv3d_transpose(base.to_variable(input_array))
1318
            dy_rlt_value = dy_rlt.numpy()
1319 1320 1321
        np.testing.assert_allclose(static_rlt2, static_rlt, rtol=1e-05)
        np.testing.assert_allclose(dy_rlt_value, static_rlt, rtol=1e-05)
        np.testing.assert_allclose(dy_eager_rlt_value, static_rlt, rtol=1e-05)
L
lujun 已提交
1322

1323
        with self.dynamic_graph():
1324 1325 1326 1327 1328
            with _test_eager_guard():
                images = np.ones([2, 3, 6, 6, 6], dtype='float32')
                custom_weight = np.random.randn(3, 3, 2, 2, 2).astype("float32")
                weight_attr = fluid.ParamAttr(
                    initializer=fluid.initializer.NumpyArrayInitializer(
1329 1330 1331
                        custom_weight
                    )
                )
1332 1333 1334 1335
                conv3d1 = paddle.nn.Conv3DTranspose(
                    in_channels=3,
                    out_channels=3,
                    kernel_size=2,
1336 1337
                    bias_attr='eager_conv3d1_b',
                )
1338 1339 1340 1341 1342
                conv3d2 = paddle.nn.Conv3DTranspose(
                    in_channels=3,
                    out_channels=3,
                    kernel_size=2,
                    weight_attr=weight_attr,
1343 1344
                    bias_attr='eager_conv3d2_b',
                )
1345 1346 1347
                dy_ret1 = conv3d1(base.to_variable(images))
                dy_ret2 = conv3d2(base.to_variable(images))
                self.assertFalse(
1348 1349
                    np.array_equal(dy_ret1.numpy(), dy_ret2.numpy())
                )
1350 1351 1352 1353

                conv3d1_weight_np = conv3d1.weight.numpy()
                conv3d1_bias = conv3d1.bias
                self.assertFalse(
1354 1355
                    np.array_equal(conv3d1_weight_np, conv3d2.weight.numpy())
                )
1356
                conv3d2.weight.set_value(conv3d1_weight_np)
1357 1358 1359
                np.testing.assert_array_equal(
                    conv3d1_weight_np, conv3d2.weight.numpy()
                )
1360 1361 1362
                conv3d1.bias.set_value(conv3d1_bias)
                dy_ret1 = conv3d1(base.to_variable(images))
                dy_ret2 = conv3d2(base.to_variable(images))
1363
                np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
1364 1365 1366

                conv3d2.weight = conv3d1.weight
                conv3d2.bias = conv3d1.bias
1367 1368 1369 1370 1371 1372
                np.testing.assert_array_equal(
                    conv3d1.weight.numpy(), conv3d2.weight.numpy()
                )
                np.testing.assert_array_equal(
                    conv3d1.bias.numpy(), conv3d2.bias.numpy()
                )
1373

1374 1375
            images = np.ones([2, 3, 6, 6, 6], dtype='float32')
            custom_weight = np.random.randn(3, 3, 2, 2, 2).astype("float32")
1376 1377 1378 1379 1380
            weight_attr = fluid.ParamAttr(
                initializer=fluid.initializer.NumpyArrayInitializer(
                    custom_weight
                )
            )
1381 1382 1383 1384
            conv3d1 = paddle.nn.Conv3DTranspose(
                in_channels=3,
                out_channels=3,
                kernel_size=2,
1385 1386
                bias_attr='conv3d1_b',
            )
1387 1388 1389 1390 1391
            conv3d2 = paddle.nn.Conv3DTranspose(
                in_channels=3,
                out_channels=3,
                kernel_size=2,
                weight_attr=weight_attr,
1392 1393
                bias_attr='conv3d2_b',
            )
1394 1395 1396 1397 1398 1399 1400
            dy_ret1 = conv3d1(base.to_variable(images))
            dy_ret2 = conv3d2(base.to_variable(images))
            self.assertFalse(np.array_equal(dy_ret1.numpy(), dy_ret2.numpy()))

            conv3d1_weight_np = conv3d1.weight.numpy()
            conv3d1_bias = conv3d1.bias
            self.assertFalse(
1401 1402
                np.array_equal(conv3d1_weight_np, conv3d2.weight.numpy())
            )
1403
            conv3d2.weight.set_value(conv3d1_weight_np)
1404 1405 1406
            np.testing.assert_array_equal(
                conv3d1_weight_np, conv3d2.weight.numpy()
            )
1407 1408 1409
            conv3d1.bias.set_value(conv3d1_bias)
            dy_ret1 = conv3d1(base.to_variable(images))
            dy_ret2 = conv3d2(base.to_variable(images))
1410
            np.testing.assert_array_equal(dy_ret1.numpy(), dy_ret2.numpy())
1411 1412 1413

            conv3d2.weight = conv3d1.weight
            conv3d2.bias = conv3d1.bias
1414 1415 1416 1417 1418 1419
            np.testing.assert_array_equal(
                conv3d1.weight.numpy(), conv3d2.weight.numpy()
            )
            np.testing.assert_array_equal(
                conv3d1.bias.numpy(), conv3d2.bias.numpy()
            )
1420

1421
    def func_while_loop(self):
1422 1423 1424 1425 1426
        with self.static_graph():
            i = layers.fill_constant(shape=[1], dtype='int64', value=0)
            ten = layers.fill_constant(shape=[1], dtype='int64', value=10)

            def cond(i):
L
LiYuRio 已提交
1427
                return paddle.less_than(i, ten)
1428 1429 1430 1431

            def body(i):
                return i + 1

1432
            out = paddle.static.nn.while_loop(cond, body, [i])
1433 1434 1435 1436 1437 1438
            static_ret = self.get_static_graph_result(feed={}, fetch_list=out)

        with self.dynamic_graph():
            i = layers.fill_constant(shape=[1], dtype='int64', value=0)
            ten = layers.fill_constant(shape=[1], dtype='int64', value=10)

1439
            def cond1(i):
L
LiYuRio 已提交
1440
                return paddle.less_than(i, ten)
1441

1442
            def body1(i):
1443 1444
                return i + 1

1445
            dy_ret = paddle.static.nn.while_loop(cond1, body1, [i])
1446 1447 1448 1449 1450 1451
            with self.assertRaises(ValueError):
                j = layers.fill_constant(shape=[1], dtype='int64', value=0)

                def body2(i):
                    return i + 1, i + 2

1452
                paddle.static.nn.while_loop(cond1, body2, [j])
1453

1454
        np.testing.assert_array_equal(static_ret[0], dy_ret[0].numpy())
1455

1456 1457 1458 1459 1460
    def test_while_loop(self):
        with _test_eager_guard():
            self.func_while_loop()
        self.func_while_loop()

1461 1462 1463 1464 1465 1466 1467
    def test_compare(self):
        value_a = np.arange(3)
        value_b = np.arange(3)
        # less than
        with self.static_graph():
            a = layers.data(name='a', shape=[1], dtype='int64')
            b = layers.data(name='b', shape=[1], dtype='int64')
L
LiYuRio 已提交
1468
            cond = paddle.less_than(x=a, y=b)
1469 1470 1471
            static_ret = self.get_static_graph_result(
                feed={"a": value_a, "b": value_b}, fetch_list=[cond]
            )[0]
1472
        with self.dynamic_graph():
1473 1474 1475
            with _test_eager_guard():
                da = base.to_variable(value_a)
                db = base.to_variable(value_b)
L
LiYuRio 已提交
1476
                dcond = paddle.less_than(x=da, y=db)
1477 1478 1479 1480

                for i in range(len(static_ret)):
                    self.assertTrue(dcond.numpy()[i] == static_ret[i])

1481 1482
            da = base.to_variable(value_a)
            db = base.to_variable(value_b)
L
LiYuRio 已提交
1483
            dcond = paddle.less_than(x=da, y=db)
1484

1485 1486
            for i in range(len(static_ret)):
                self.assertTrue(dcond.numpy()[i] == static_ret[i])
1487 1488 1489 1490 1491

        # less equal
        with self.static_graph():
            a1 = layers.data(name='a1', shape=[1], dtype='int64')
            b1 = layers.data(name='b1', shape=[1], dtype='int64')
1492
            cond1 = paddle.less_equal(x=a1, y=b1)
1493 1494 1495
            static_ret1 = self.get_static_graph_result(
                feed={"a1": value_a, "b1": value_b}, fetch_list=[cond1]
            )[0]
1496
        with self.dynamic_graph():
1497 1498 1499
            with _test_eager_guard():
                da1 = base.to_variable(value_a)
                db1 = base.to_variable(value_b)
1500
                dcond1 = paddle.less_equal(x=da1, y=db1)
1501 1502 1503 1504

                for i in range(len(static_ret1)):
                    self.assertTrue(dcond1.numpy()[i] == static_ret1[i])

1505 1506
            da1 = base.to_variable(value_a)
            db1 = base.to_variable(value_b)
1507
            dcond1 = paddle.less_equal(x=da1, y=db1)
1508 1509 1510 1511

            for i in range(len(static_ret1)):
                self.assertTrue(dcond1.numpy()[i] == static_ret1[i])

1512
        # greater than
1513 1514 1515
        with self.static_graph():
            a2 = layers.data(name='a2', shape=[1], dtype='int64')
            b2 = layers.data(name='b2', shape=[1], dtype='int64')
1516
            cond2 = paddle.greater_than(x=a2, y=b2)
1517 1518 1519
            static_ret2 = self.get_static_graph_result(
                feed={"a2": value_a, "b2": value_b}, fetch_list=[cond2]
            )[0]
1520
        with self.dynamic_graph():
1521 1522 1523
            with _test_eager_guard():
                da2 = base.to_variable(value_a)
                db2 = base.to_variable(value_b)
1524
                dcond2 = paddle.greater_than(x=da2, y=db2)
1525 1526 1527 1528

                for i in range(len(static_ret2)):
                    self.assertTrue(dcond2.numpy()[i] == static_ret2[i])

1529 1530
            da2 = base.to_variable(value_a)
            db2 = base.to_variable(value_b)
1531
            dcond2 = paddle.greater_than(x=da2, y=db2)
1532 1533 1534 1535

            for i in range(len(static_ret2)):
                self.assertTrue(dcond2.numpy()[i] == static_ret2[i])

1536
        # greater equal
1537 1538 1539
        with self.static_graph():
            a3 = layers.data(name='a3', shape=[1], dtype='int64')
            b3 = layers.data(name='b3', shape=[1], dtype='int64')
1540
            cond3 = paddle.greater_equal(x=a3, y=b3)
1541 1542 1543
            static_ret3 = self.get_static_graph_result(
                feed={"a3": value_a, "b3": value_b}, fetch_list=[cond3]
            )[0]
1544
        with self.dynamic_graph():
1545 1546 1547
            with _test_eager_guard():
                da3 = base.to_variable(value_a)
                db3 = base.to_variable(value_b)
1548
                dcond3 = paddle.greater_equal(x=da3, y=db3)
1549 1550 1551 1552

                for i in range(len(static_ret3)):
                    self.assertTrue(dcond3.numpy()[i] == static_ret3[i])

1553 1554
            da3 = base.to_variable(value_a)
            db3 = base.to_variable(value_b)
1555
            dcond3 = paddle.greater_equal(x=da3, y=db3)
1556 1557 1558 1559 1560 1561 1562 1563

            for i in range(len(static_ret3)):
                self.assertTrue(dcond3.numpy()[i] == static_ret3[i])

        # equal
        with self.static_graph():
            a4 = layers.data(name='a4', shape=[1], dtype='int64')
            b4 = layers.data(name='b4', shape=[1], dtype='int64')
1564
            cond4 = paddle.equal(x=a4, y=b4)
1565 1566 1567
            static_ret4 = self.get_static_graph_result(
                feed={"a4": value_a, "b4": value_b}, fetch_list=[cond4]
            )[0]
1568
        with self.dynamic_graph():
1569 1570 1571
            with _test_eager_guard():
                da4 = base.to_variable(value_a)
                db4 = base.to_variable(value_b)
1572
                dcond4 = paddle.equal(x=da4, y=db4)
1573 1574 1575 1576

                for i in range(len(static_ret4)):
                    self.assertTrue(dcond4.numpy()[i] == static_ret4[i])

1577 1578
            da4 = base.to_variable(value_a)
            db4 = base.to_variable(value_b)
1579
            dcond4 = paddle.equal(x=da4, y=db4)
1580 1581 1582 1583 1584 1585 1586 1587

            for i in range(len(static_ret4)):
                self.assertTrue(dcond4.numpy()[i] == static_ret4[i])

        # not equal
        with self.static_graph():
            a5 = layers.data(name='a5', shape=[1], dtype='int64')
            b5 = layers.data(name='b5', shape=[1], dtype='int64')
1588
            cond5 = paddle.equal(x=a5, y=b5)
1589 1590 1591
            static_ret5 = self.get_static_graph_result(
                feed={"a5": value_a, "b5": value_b}, fetch_list=[cond5]
            )[0]
1592
        with self.dynamic_graph():
1593 1594 1595
            with _test_eager_guard():
                da5 = base.to_variable(value_a)
                db5 = base.to_variable(value_b)
1596
                dcond5 = paddle.equal(x=da5, y=db5)
1597 1598 1599 1600

                for i in range(len(static_ret5)):
                    self.assertTrue(dcond5.numpy()[i] == static_ret5[i])

1601 1602
            da5 = base.to_variable(value_a)
            db5 = base.to_variable(value_b)
1603
            dcond5 = paddle.equal(x=da5, y=db5)
1604 1605 1606 1607

            for i in range(len(static_ret5)):
                self.assertTrue(dcond5.numpy()[i] == static_ret5[i])

1608 1609
    def test_cond(self):
        def less_than_branch(a, b):
1610
            return paddle.add(a, b)
1611 1612

        def greater_equal_branch(a, b):
1613
            return paddle.subtract(a, b)
1614 1615

        with self.static_graph():
1616 1617 1618 1619 1620 1621
            a = fluid.layers.fill_constant(
                shape=[1], dtype='float32', value=0.1
            )
            b = fluid.layers.fill_constant(
                shape=[1], dtype='float32', value=0.23
            )
1622
            out = paddle.static.nn.cond(
1623 1624 1625 1626 1627 1628 1629 1630 1631
                a >= b,
                lambda: greater_equal_branch(a, b),
                lambda: less_than_branch(a, b),
            )
            place = (
                fluid.CUDAPlace(0)
                if core.is_compiled_with_cuda()
                else fluid.CPUPlace()
            )
1632 1633 1634 1635 1636
            exe = fluid.Executor(place)
            ret = exe.run(fetch_list=[out])
            static_res = ret[0]

        with self.dynamic_graph():
1637 1638 1639
            with _test_eager_guard():
                a = fluid.dygraph.to_variable(np.array([0.1]).astype('float32'))
                b = fluid.dygraph.to_variable(
1640 1641
                    np.array([0.23]).astype('float32')
                )
1642
                out = paddle.static.nn.cond(
1643 1644 1645 1646
                    a < b,
                    lambda: less_than_branch(a, b),
                    lambda: greater_equal_branch(a, b),
                )
1647
                out2 = paddle.static.nn.cond(
1648 1649 1650 1651
                    a >= b,
                    lambda: greater_equal_branch(a, b),
                    lambda: less_than_branch(a, b),
                )
1652 1653
                eager_dynamic_res = out.numpy()
                eager_dynamic_res2 = out2.numpy()
1654 1655 1656
                np.testing.assert_array_equal(
                    eager_dynamic_res, eager_dynamic_res2
                )
1657
                with self.assertRaises(TypeError):
1658
                    paddle.static.nn.cond(a < b, 'str', 'str')
1659
                with self.assertRaises(TypeError):
1660
                    paddle.static.nn.cond(a >= b, 'str', 'str')
1661

1662 1663
            a = fluid.dygraph.to_variable(np.array([0.1]).astype('float32'))
            b = fluid.dygraph.to_variable(np.array([0.23]).astype('float32'))
1664
            out = paddle.static.nn.cond(
1665 1666 1667 1668
                a < b,
                lambda: less_than_branch(a, b),
                lambda: greater_equal_branch(a, b),
            )
1669
            out2 = paddle.static.nn.cond(
1670 1671 1672 1673
                a >= b,
                lambda: greater_equal_branch(a, b),
                lambda: less_than_branch(a, b),
            )
1674 1675
            dynamic_res = out.numpy()
            dynamic_res2 = out2.numpy()
1676
            np.testing.assert_array_equal(dynamic_res, dynamic_res2)
1677
            with self.assertRaises(TypeError):
1678
                paddle.static.nn.cond(a < b, 'str', 'str')
1679
            with self.assertRaises(TypeError):
1680
                paddle.static.nn.cond(a >= b, 'str', 'str')
1681

1682 1683
        np.testing.assert_array_equal(static_res, dynamic_res)
        np.testing.assert_array_equal(static_res, eager_dynamic_res)
1684

1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
    def test_case(self):
        def fn_1():
            return layers.fill_constant(shape=[1, 2], dtype='float32', value=1)

        def fn_2():
            return layers.fill_constant(shape=[2, 2], dtype='int32', value=2)

        def fn_3():
            return layers.fill_constant(shape=[3], dtype='int32', value=3)

        with self.static_graph():
            x = layers.fill_constant(shape=[1], dtype='float32', value=0.3)
            y = layers.fill_constant(shape=[1], dtype='float32', value=0.1)
            z = layers.fill_constant(shape=[1], dtype='float32', value=0.2)

L
LiYuRio 已提交
1700 1701
            pred_1 = paddle.less_than(z, x)  # true: 0.2 < 0.3
            pred_2 = paddle.less_than(x, y)  # false: 0.3 < 0.1
1702
            pred_3 = paddle.equal(x, y)  # false: 0.3 == 0.1
1703

1704
            out_1 = paddle.static.nn.case(
1705 1706
                pred_fn_pairs=[(pred_1, fn_1), (pred_2, fn_2)], default=fn_3
            )
1707 1708 1709
            out_2 = paddle.static.nn.case(
                pred_fn_pairs=[(pred_2, fn_2), (pred_3, fn_3)]
            )
1710

1711 1712 1713 1714 1715
            place = (
                fluid.CUDAPlace(0)
                if core.is_compiled_with_cuda()
                else fluid.CPUPlace()
            )
1716 1717 1718 1719
            exe = fluid.Executor(place)
            static_res1, static_res2 = exe.run(fetch_list=[out_1, out_2])

        with self.dynamic_graph():
1720 1721 1722 1723 1724
            with _test_eager_guard():
                x = layers.fill_constant(shape=[1], dtype='float32', value=0.3)
                y = layers.fill_constant(shape=[1], dtype='float32', value=0.1)
                z = layers.fill_constant(shape=[1], dtype='float32', value=0.2)

L
LiYuRio 已提交
1725 1726
                pred_1 = paddle.less_than(z, x)  # true: 0.2 < 0.3
                pred_2 = paddle.less_than(x, y)  # false: 0.3 < 0.1
1727
                pred_3 = paddle.equal(x, y)  # false: 0.3 == 0.1
1728

1729
                out_1 = paddle.static.nn.case(
1730 1731
                    pred_fn_pairs=[(pred_1, fn_1), (pred_2, fn_2)], default=fn_3
                )
1732
                out_2 = paddle.static.nn.case(
1733 1734
                    pred_fn_pairs=[(pred_2, fn_2), (pred_3, fn_3)]
                )
1735 1736 1737
                eager_dynamic_res1 = out_1.numpy()
                eager_dynamic_res2 = out_2.numpy()

1738 1739 1740 1741
            x = layers.fill_constant(shape=[1], dtype='float32', value=0.3)
            y = layers.fill_constant(shape=[1], dtype='float32', value=0.1)
            z = layers.fill_constant(shape=[1], dtype='float32', value=0.2)

L
LiYuRio 已提交
1742 1743
            pred_1 = paddle.less_than(z, x)  # true: 0.2 < 0.3
            pred_2 = paddle.less_than(x, y)  # false: 0.3 < 0.1
1744
            pred_3 = paddle.equal(x, y)  # false: 0.3 == 0.1
1745

1746
            out_1 = paddle.static.nn.case(
1747 1748
                pred_fn_pairs=[(pred_1, fn_1), (pred_2, fn_2)], default=fn_3
            )
1749 1750 1751
            out_2 = paddle.static.nn.case(
                pred_fn_pairs=[(pred_2, fn_2), (pred_3, fn_3)]
            )
1752 1753 1754
            dynamic_res1 = out_1.numpy()
            dynamic_res2 = out_2.numpy()

1755 1756 1757 1758
        np.testing.assert_array_equal(static_res1, dynamic_res1)
        np.testing.assert_array_equal(static_res2, dynamic_res2)
        np.testing.assert_array_equal(static_res1, eager_dynamic_res1)
        np.testing.assert_array_equal(static_res2, eager_dynamic_res2)
1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773

    def test_switch_case(self):
        def fn_1():
            return layers.fill_constant(shape=[1, 2], dtype='float32', value=1)

        def fn_2():
            return layers.fill_constant(shape=[2, 2], dtype='int32', value=2)

        def fn_3():
            return layers.fill_constant(shape=[3], dtype='int32', value=3)

        with self.static_graph():
            index_1 = layers.fill_constant(shape=[1], dtype='int32', value=1)
            index_2 = layers.fill_constant(shape=[1], dtype='int32', value=2)

1774
            out_1 = paddle.static.nn.switch_case(
1775 1776 1777 1778
                branch_index=index_1,
                branch_fns={1: fn_1, 2: fn_2},
                default=fn_3,
            )
1779
            out_2 = paddle.static.nn.switch_case(
1780 1781 1782 1783
                branch_index=index_2,
                branch_fns=[(1, fn_1), (2, fn_2)],
                default=fn_3,
            )
1784
            out_3 = paddle.static.nn.switch_case(
1785 1786 1787 1788 1789 1790 1791 1792 1793
                branch_index=index_2,
                branch_fns=[(0, fn_1), (4, fn_2), (7, fn_3)],
            )

            place = (
                fluid.CUDAPlace(0)
                if core.is_compiled_with_cuda()
                else fluid.CPUPlace()
            )
1794 1795
            exe = fluid.Executor(place)
            static_res1, static_res2, static_res3 = exe.run(
1796 1797
                fetch_list=[out_1, out_2, out_3]
            )
1798 1799

        with self.dynamic_graph():
1800
            with _test_eager_guard():
1801 1802 1803 1804 1805 1806 1807
                index_1 = layers.fill_constant(
                    shape=[1], dtype='int32', value=1
                )
                index_2 = layers.fill_constant(
                    shape=[1], dtype='int32', value=2
                )

1808
                out_1 = paddle.static.nn.switch_case(
1809 1810 1811 1812
                    branch_index=index_1,
                    branch_fns={1: fn_1, 2: fn_2},
                    default=fn_3,
                )
1813
                out_2 = paddle.static.nn.switch_case(
1814 1815 1816 1817
                    branch_index=index_2,
                    branch_fns=[(1, fn_1), (2, fn_2)],
                    default=fn_3,
                )
1818
                out_3 = paddle.static.nn.switch_case(
1819 1820 1821
                    branch_index=index_2,
                    branch_fns=[(0, fn_1), (4, fn_2), (7, fn_3)],
                )
1822 1823 1824 1825 1826

                eager_dynamic_res1 = out_1.numpy()
                eager_dynamic_res2 = out_2.numpy()
                eager_dynamic_res3 = out_3.numpy()

1827 1828 1829
            index_1 = layers.fill_constant(shape=[1], dtype='int32', value=1)
            index_2 = layers.fill_constant(shape=[1], dtype='int32', value=2)

1830
            out_1 = paddle.static.nn.switch_case(
1831 1832 1833 1834
                branch_index=index_1,
                branch_fns={1: fn_1, 2: fn_2},
                default=fn_3,
            )
1835
            out_2 = paddle.static.nn.switch_case(
1836 1837 1838 1839
                branch_index=index_2,
                branch_fns=[(1, fn_1), (2, fn_2)],
                default=fn_3,
            )
1840
            out_3 = paddle.static.nn.switch_case(
1841 1842 1843
                branch_index=index_2,
                branch_fns=[(0, fn_1), (4, fn_2), (7, fn_3)],
            )
1844 1845 1846 1847 1848

            dynamic_res1 = out_1.numpy()
            dynamic_res2 = out_2.numpy()
            dynamic_res3 = out_3.numpy()

1849 1850 1851 1852 1853 1854
        np.testing.assert_array_equal(static_res1, dynamic_res1)
        np.testing.assert_array_equal(static_res2, dynamic_res2)
        np.testing.assert_array_equal(static_res3, dynamic_res3)
        np.testing.assert_array_equal(static_res1, eager_dynamic_res1)
        np.testing.assert_array_equal(static_res2, eager_dynamic_res2)
        np.testing.assert_array_equal(static_res3, eager_dynamic_res3)
1855

1856 1857 1858 1859
    def test_crop_tensor(self):
        with self.static_graph():
            x = fluid.layers.data(name="x1", shape=[6, 5, 8])

1860 1861 1862 1863 1864 1865
            dim1 = fluid.layers.data(
                name="dim1", shape=[1], append_batch_size=False
            )
            dim2 = fluid.layers.data(
                name="dim2", shape=[1], append_batch_size=False
            )
1866
            crop_shape1 = (1, 2, 4, 4)
1867 1868 1869
            crop_shape2 = fluid.layers.data(
                name="crop_shape", shape=[4], append_batch_size=False
            )
1870 1871
            crop_shape3 = [-1, dim1, dim2, 4]
            crop_offsets1 = [0, 0, 1, 0]
1872 1873 1874
            crop_offsets2 = fluid.layers.data(
                name="crop_offset", shape=[4], append_batch_size=False
            )
1875 1876
            crop_offsets3 = [0, dim1, dim2, 0]

1877 1878 1879
            out1 = paddle.crop(x, shape=crop_shape1, offsets=crop_offsets1)
            out2 = paddle.crop(x, shape=crop_shape2, offsets=crop_offsets2)
            out3 = paddle.crop(x, shape=crop_shape3, offsets=crop_offsets3)
1880 1881 1882 1883 1884

            self.assertIsNotNone(out1)
            self.assertIsNotNone(out2)
            self.assertIsNotNone(out3)

1885 1886 1887
    def test_shard_index(self):
        with self.static_graph():
            x = fluid.layers.data(name="label", shape=[4, 1], dtype='int64')
1888
            shard_label = paddle.shard_index(
1889 1890
                input=x, index_num=20, nshards=2, shard_id=0
            )
1891 1892 1893

        self.assertIsNotNone(shard_label)

1894 1895 1896 1897 1898 1899 1900
    def test_accuracy(self):
        x = np.random.rand(3, 32, 32).astype("float32")
        y = np.array([[1], [0], [1]])
        with self.static_graph():
            data = fluid.data(name="input", shape=[-1, 32, 32], dtype="float32")
            label = fluid.data(name="label", shape=[-1, 1], dtype="int")
            fc_out = fluid.layers.fc(input=data, size=10)
1901
            predict = paddle.nn.functional.softmax(fc_out)
1902
            result = paddle.static.accuracy(input=predict, label=label, k=5)
1903 1904 1905 1906
            place = fluid.CPUPlace()
            exe = fluid.Executor(place)

            exe.run(fluid.default_startup_program())
L
Leo Chen 已提交
1907 1908
            # x = np.random.rand(3, 32, 32).astype("float32")
            # y = np.array([[1], [0], [1]])
1909 1910 1911
            static_out = exe.run(
                feed={"input": x, "label": y}, fetch_list=result[0]
            )
1912

L
Leo Chen 已提交
1913
        with self.dynamic_graph(force_to_use_cpu=True):
1914 1915 1916
            data = base.to_variable(x)
            label = base.to_variable(y)
            fc_out = fluid.layers.fc(data, size=10)
1917
            predict = paddle.nn.functional.softmax(fc_out)
1918 1919 1920
            dynamic_out = paddle.static.accuracy(
                input=predict, label=label, k=5
            )
1921

1922
        np.testing.assert_array_equal(static_out[0], dynamic_out.numpy())
1923

Y
Yu Yang 已提交
1924

1925
class TestBook(LayerTest):
H
hong 已提交
1926 1927
    def setUp(self):
        self.only_static_set = set({"make_word_embedding"})
1928 1929 1930 1931 1932 1933 1934
        self.not_compare_static_dygraph_set = set(
            {
                "make_gaussian_random",
                "make_kldiv_loss",
                "make_uniform_random_batch_size_like",
            }
        )
1935
        self.all_close_compare = set({"make_spectral_norm"})
H
hong 已提交
1936

1937
    def func_all_layers(self):
1938 1939 1940 1941 1942
        attrs = (getattr(self, name) for name in dir(self))
        methods = filter(inspect.ismethod, attrs)
        for method in methods:
            if not method.__name__.startswith('make_'):
                continue
M
minqiyang 已提交
1943 1944 1945
            self._low_data_bound = 0
            self._high_data_bound = 2
            self._batch_size = 2
1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957
            self._feed_dict = {}
            self._force_to_use_cpu = False
            with self.static_graph():
                static_var = method()
                if isinstance(static_var, tuple):
                    static_var = static_var[0]

                if static_var is not None:
                    fetch_list = [static_var.name]
                    static_result = self.get_static_graph_result(
                        feed=self._feed_dict,
                        fetch_list=fetch_list,
1958 1959
                        force_to_use_cpu=self._force_to_use_cpu,
                    )
H
hong 已提交
1960

1961 1962
                else:
                    continue
H
hong 已提交
1963 1964
            if method.__name__ in self.only_static_set:
                continue
1965 1966 1967 1968 1969

            with self.dynamic_graph(self._force_to_use_cpu):
                dy_result = method()
                if isinstance(dy_result, tuple):
                    dy_result = dy_result[0]
1970
                dy_result_value = dy_result.numpy()
1971

1972
            if method.__name__ in self.all_close_compare:
1973 1974 1975 1976 1977 1978
                np.testing.assert_allclose(
                    static_result[0],
                    dy_result_value,
                    rtol=1e-05,
                    atol=0,
                    err_msg='Result of function [{}] compare failed'.format(
1979 1980 1981
                        method.__name__
                    ),
                )
1982 1983
                continue

H
hong 已提交
1984
            if method.__name__ not in self.not_compare_static_dygraph_set:
1985 1986 1987 1988
                np.testing.assert_array_equal(
                    static_result[0],
                    dy_result_value,
                    err_msg='Result of function [{}] not equal'.format(
1989 1990 1991
                        method.__name__
                    ),
                )
1992

1993 1994 1995 1996 1997
    def test_all_layers(self):
        with _test_eager_guard():
            self.func_all_layers()
        self.func_all_layers()

1998 1999 2000
    def _get_np_data(self, shape, dtype, append_batch_size=True):
        np.random.seed(self.seed)
        if append_batch_size:
M
minqiyang 已提交
2001
            shape = [self._batch_size] + shape
2002 2003 2004 2005 2006
        if dtype == 'float32':
            return np.random.random(shape).astype(dtype)
        elif dtype == 'float64':
            return np.random.random(shape).astype(dtype)
        elif dtype == 'int32':
2007 2008 2009
            return np.random.randint(
                self._low_data_bound, self._high_data_bound, shape
            ).astype(dtype)
2010
        elif dtype == 'int64':
2011 2012 2013 2014 2015 2016 2017
            return np.random.randint(
                self._low_data_bound, self._high_data_bound, shape
            ).astype(dtype)

    def _get_data(
        self, name, shape, dtype, set_feed_dict=True, append_batch_size=True
    ):
2018
        if base.enabled():
2019 2020 2021 2022 2023
            return base.to_variable(
                value=self._get_np_data(shape, dtype, append_batch_size),
                name=name,
                zero_copy=False,
            )
2024 2025
        else:
            if set_feed_dict:
2026
                self._feed_dict[name] = self._get_np_data(
2027 2028 2029 2030 2031 2032 2033 2034
                    shape, dtype, append_batch_size
                )
            return layers.data(
                name=name,
                shape=shape,
                dtype=dtype,
                append_batch_size=append_batch_size,
            )
2035 2036

    def make_fit_a_line(self):
2037 2038 2039 2040
        with program_guard(
            fluid.default_main_program(),
            startup_program=fluid.default_startup_program(),
        ):
2041
            x = self._get_data(name='x', shape=[13], dtype='float32')
Y
Yu Yang 已提交
2042
            y_predict = layers.fc(input=x, size=1, act=None)
2043
            y = self._get_data(name='y', shape=[1], dtype='float32')
2044 2045 2046
            cost = paddle.nn.functional.square_error_cost(
                input=y_predict, label=y
            )
2047
            avg_cost = paddle.mean(cost)
2048
            return avg_cost
Y
Yu Yang 已提交
2049

2050
    def make_recognize_digits_mlp(self):
2051 2052 2053
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
Y
Yu Yang 已提交
2054
            # Change g_program, so the rest layers use `g_program`
2055 2056
            images = self._get_data(name='pixel', shape=[784], dtype='float32')
            label = self._get_data(name='label', shape=[1], dtype='int64')
Y
Yu Yang 已提交
2057 2058
            hidden1 = layers.fc(input=images, size=128, act='relu')
            hidden2 = layers.fc(input=hidden1, size=64, act='relu')
2059 2060 2061 2062 2063 2064
            predict = layers.fc(
                input=[hidden2, hidden1],
                size=10,
                act='softmax',
                param_attr=["sftmax.w1", "sftmax.w2"],
            )
2065 2066 2067
            cost = paddle.nn.functional.cross_entropy(
                input=predict, label=label, reduction='none', use_softmax=False
            )
2068
            avg_cost = paddle.mean(cost)
2069
            return avg_cost
Y
Yu Yang 已提交
2070

2071
    def make_conv2d_transpose(self):
2072 2073 2074
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2075
            img = self._get_data(name='pixel', shape=[3, 2, 2], dtype='float32')
2076
            return paddle.static.nn.conv2d_transpose(
2077 2078
                input=img, num_filters=10, output_size=28
            )
2079

2080
    def make_recognize_digits_conv(self):
2081 2082 2083 2084 2085 2086
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            images = self._get_data(
                name='pixel', shape=[1, 28, 28], dtype='float32'
            )
2087
            label = self._get_data(name='label', shape=[1], dtype='int64')
2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103
            conv_pool_1 = nets.simple_img_conv_pool(
                input=images,
                filter_size=5,
                num_filters=2,
                pool_size=2,
                pool_stride=2,
                act="relu",
            )
            conv_pool_2 = nets.simple_img_conv_pool(
                input=conv_pool_1,
                filter_size=5,
                num_filters=4,
                pool_size=2,
                pool_stride=2,
                act="relu",
            )
Y
Yu Yang 已提交
2104 2105

            predict = layers.fc(input=conv_pool_2, size=10, act="softmax")
2106 2107 2108
            cost = paddle.nn.functional.cross_entropy(
                input=predict, label=label, reduction='none', use_softmax=False
            )
2109
            avg_cost = paddle.mean(cost)
2110
            return avg_cost
Y
Yu Yang 已提交
2111

2112
    def make_word_embedding(self):
2113 2114 2115
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
Y
Yu Yang 已提交
2116 2117
            dict_size = 10000
            embed_size = 32
2118
            first_word = self._get_data(name='firstw', shape=[1], dtype='int64')
2119 2120 2121
            second_word = self._get_data(
                name='secondw', shape=[1], dtype='int64'
            )
2122 2123 2124
            third_word = self._get_data(name='thirdw', shape=[1], dtype='int64')
            forth_word = self._get_data(name='forthw', shape=[1], dtype='int64')
            next_word = self._get_data(name='nextw', shape=[1], dtype='int64')
Y
Yu Yang 已提交
2125

2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150
            embed_first = layers.embedding(
                input=first_word,
                size=[dict_size, embed_size],
                dtype='float32',
                param_attr='shared_w',
            )
            embed_second = layers.embedding(
                input=second_word,
                size=[dict_size, embed_size],
                dtype='float32',
                param_attr='shared_w',
            )

            embed_third = layers.embedding(
                input=third_word,
                size=[dict_size, embed_size],
                dtype='float32',
                param_attr='shared_w',
            )
            embed_forth = layers.embedding(
                input=forth_word,
                size=[dict_size, embed_size],
                dtype='float32',
                param_attr='shared_w',
            )
Y
Yu Yang 已提交
2151 2152 2153

            concat_embed = layers.concat(
                input=[embed_first, embed_second, embed_third, embed_forth],
2154 2155
                axis=1,
            )
Y
Yu Yang 已提交
2156 2157

            hidden1 = layers.fc(input=concat_embed, size=256, act='sigmoid')
2158 2159 2160
            predict_word = layers.fc(
                input=hidden1, size=dict_size, act='softmax'
            )
2161 2162 2163 2164 2165 2166
            cost = paddle.nn.functional.cross_entropy(
                input=predict_word,
                label=next_word,
                reduction='none',
                use_softmax=False,
            )
2167
            avg_cost = paddle.mean(cost)
2168
            return avg_cost
Y
Yu Yang 已提交
2169

2170
    def make_pool2d(self):
2171 2172 2173
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2174
            x = self._get_data(name='x', shape=[3, 224, 224], dtype='float32')
C
ccrrong 已提交
2175 2176
            return paddle.nn.functional.max_pool2d(
                x, kernel_size=[5, 3], stride=[1, 2], padding=(2, 1)
2177
            )
2178

K
Kaipeng Deng 已提交
2179
    def make_pool2d_infershape(self):
2180 2181 2182
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
K
Kaipeng Deng 已提交
2183
            theta = self._get_data("theta", shape=[2, 3], dtype='float32')
2184 2185 2186
            x = paddle.nn.functional.affine_grid(
                theta, out_shape=[2, 3, 244, 244]
            )
C
ccrrong 已提交
2187 2188
            return paddle.nn.functional.max_pool2d(
                x, kernel_size=[5, 3], stride=[1, 2], padding=(2, 1)
2189
            )
K
Kaipeng Deng 已提交
2190

2191
    def make_softmax(self):
2192 2193 2194
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2195
            data = self._get_data(name='data', shape=[10], dtype='float32')
D
dangqingqing 已提交
2196
            hid = layers.fc(input=data, size=20)
2197
            return paddle.nn.functional.softmax(hid, axis=1)
D
dangqingqing 已提交
2198

2199
    @prog_scope()
2200
    def make_nce(self):
Y
Yang Yu 已提交
2201 2202
        window_size = 5
        words = []
2203
        for i in range(window_size):
Y
Yang Yu 已提交
2204
            words.append(
2205 2206 2207 2208
                self._get_data(
                    name='word_{0}'.format(i), shape=[1], dtype='int64'
                )
            )
Y
Yang Yu 已提交
2209 2210

        dict_size = 10000
M
minqiyang 已提交
2211
        label_word = int(window_size // 2) + 1
Y
Yang Yu 已提交
2212 2213

        embs = []
2214
        for i in range(window_size):
Y
Yang Yu 已提交
2215 2216 2217
            if i == label_word:
                continue

2218 2219 2220 2221 2222 2223
            emb = layers.embedding(
                input=words[i],
                size=[dict_size, 32],
                param_attr='emb.w',
                is_sparse=True,
            )
Y
Yang Yu 已提交
2224 2225 2226 2227

            embs.append(emb)

        embs = layers.concat(input=embs, axis=1)
2228
        loss = paddle.static.nn.nce(
2229 2230 2231 2232 2233 2234
            input=embs,
            label=words[label_word],
            num_total_classes=dict_size,
            param_attr='nce.w',
            bias_attr='nce.b',
        )
2235
        avg_loss = paddle.mean(loss)
2236
        return avg_loss
Y
Yang Yu 已提交
2237

2238
    def make_multiplex(self):
2239 2240 2241
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2242 2243 2244
            x1 = self._get_data(name='x1', shape=[4], dtype='float32')
            x2 = self._get_data(name='x2', shape=[4], dtype='float32')
            index = self._get_data(name='index', shape=[1], dtype='int32')
2245
            out = paddle.multiplex(inputs=[x1, x2], index=index)
2246
            return out
2247 2248

    def make_softmax_with_cross_entropy(self):
2249 2250 2251
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2252 2253
            x = self._get_data(name='x', shape=[16], dtype='float32')
            y = self._get_data(name='label', shape=[1], dtype='int64')
2254
            loss, softmax = paddle.nn.functional.softmax_with_cross_entropy(
2255 2256
                x, y, return_softmax=True
            )
2257 2258 2259
            self.assertIsNotNone(loss)
            self.assertIsNotNone(softmax)

2260
            loss = paddle.nn.functional.softmax_with_cross_entropy(x, y)
2261 2262 2263 2264 2265 2266
            self.assertIsNotNone(loss)

            x1 = self._get_data(name='x1', shape=[16, 32, 64], dtype='float32')
            y1 = self._get_data(name='label1', shape=[1, 32, 64], dtype='int64')
            y2 = self._get_data(name='label2', shape=[16, 1, 64], dtype='int64')
            y3 = self._get_data(name='label3', shape=[16, 32, 1], dtype='int64')
2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278
            loss1 = paddle.nn.functional.softmax_with_cross_entropy(
                x1, y1, axis=1
            )
            loss2 = paddle.nn.functional.softmax_with_cross_entropy(
                x1, y2, axis=2
            )
            loss3 = paddle.nn.functional.softmax_with_cross_entropy(
                x1, y3, axis=3
            )
            loss4 = paddle.nn.functional.softmax_with_cross_entropy(
                x1, y3, axis=-1
            )
2279 2280 2281 2282
            self.assertIsNotNone(loss1)
            self.assertIsNotNone(loss2)
            self.assertIsNotNone(loss3)
            self.assertIsNotNone(loss4)
2283
            return loss4
2284 2285

    def make_scatter(self):
2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            x = self._get_data(
                name='x', shape=[3, 3], append_batch_size=False, dtype='float32'
            )
            idx = self._get_data(
                name='idx', shape=[2], append_batch_size=False, dtype='int32'
            )
            updates = self._get_data(
                name='updates',
                shape=[2, 3],
                append_batch_size=False,
                dtype='float32',
            )
2301
            out = paddle.scatter(x, index=idx, updates=updates)
2302
            return out
Y
yangyaming 已提交
2303

2304 2305 2306 2307
    def make_one_hot(self):
        with fluid.framework._dygraph_place_guard(place=fluid.CPUPlace()):
            label = self._get_data(name="label", shape=[1], dtype="int32")
            one_hot_label = layers.one_hot(input=label, depth=10)
2308
            return one_hot_label
2309

2310 2311 2312 2313 2314
    def make_label_smooth(self):
        # TODO(minqiyang): support gpu ut
        self._force_to_use_cpu = True
        with fluid.framework._dygraph_place_guard(place=fluid.CPUPlace()):
            label = self._get_data(name="label", shape=[1], dtype="int32")
2315
            one_hot_label = layers.one_hot(input=label, depth=10)
2316
            smooth_label = F.label_smooth(label=one_hot_label, epsilon=0.1)
2317
            return smooth_label
2318

2319
    def make_topk(self):
2320 2321 2322
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2323
            data = self._get_data(name="label", shape=[200], dtype="float32")
2324
            values, indices = paddle.topk(data, k=5)
2325 2326
            return values
            return indices
J
jerrywgz 已提交
2327

2328
    def make_l2_normalize(self):
2329 2330 2331
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2332
            x = self._get_data(name='x', shape=[8, 7, 10], dtype="float32")
2333
            output = layers.l2_normalize(x, axis=1)
2334
            return output
2335

2336
    def make_shape(self):
2337 2338 2339 2340 2341 2342
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[3, 100, 100], dtype="float32"
            )
2
201716010711 已提交
2343
            out = paddle.shape(input)
2344
            return out
B
Bai Yifan 已提交
2345

2346
    def make_pad2d(self):
2347 2348 2349 2350 2351 2352
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[3, 100, 100], dtype="float32"
            )
傅剑寒 已提交
2353 2354 2355

            tmp_pad = paddle.nn.Pad2D(
                padding=[1, 2, 3, 4],
2356 2357 2358 2359
                mode='reflect',
                data_format='NCHW',
                name="shape",
            )
傅剑寒 已提交
2360
            out = tmp_pad(input)
2361
            return out
W
whs 已提交
2362

K
Kaipeng Deng 已提交
2363
    def make_mish(self):
2364 2365 2366
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
K
Kaipeng Deng 已提交
2367
            input = self._get_data(name="input", shape=[16], dtype="float32")
2368
            out = paddle.nn.functional.mish(input, name='mish')
2369
            return out
K
Kaipeng Deng 已提交
2370

2371
    def make_cross_entropy(self):
2372 2373 2374
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2375 2376
            x = self._get_data(name="x", shape=[30, 10], dtype="float32")
            label = self._get_data(name="label", shape=[30, 1], dtype="int64")
2377
            mode = 'channel'
2378 2379 2380 2381 2382 2383 2384 2385
            out = paddle.nn.functional.cross_entropy(
                x,
                label,
                soft_label=False,
                ignore_index=4,
                reduction='none',
                use_softmax=False,
            )
2386
            return out
2387

2388
    def make_uniform_random_batch_size_like(self):
2389 2390 2391 2392 2393 2394
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[13, 11], dtype='float32'
            )
2395
            out = random.uniform_random_batch_size_like(input, [-1, 11])
2396
            return out
G
fix  
gongweibao 已提交
2397

2398
    def make_gaussian_random(self):
2399 2400 2401
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2402
            out = random.gaussian(shape=[20, 30])
2403
            return out
G
fix  
gongweibao 已提交
2404

2405
    def make_sum(self):
2406 2407 2408 2409 2410 2411
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[13, 11], dtype='float32'
            )
G
fix  
gongweibao 已提交
2412

2413
            out = paddle.add_n(input)
2414
            return out
G
fix  
gongweibao 已提交
2415

2416
    def make_slice(self):
G
fix  
gongweibao 已提交
2417 2418 2419 2420
        starts = [1, 0, 2]
        ends = [3, 3, 4]
        axes = [0, 1, 2]

2421 2422 2423 2424 2425 2426
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[3, 4, 5, 6], dtype='float32'
            )
G
fix  
gongweibao 已提交
2427

2
201716010711 已提交
2428
            out = paddle.slice(input, axes=axes, starts=starts, ends=ends)
2429
            return out
G
merge  
gongweibao 已提交
2430

2431
    def make_scale_variable(self):
2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = self._get_data(
                name="input", shape=[3, 4, 5, 6], dtype='float32'
            )
            scale_var = self._get_data(
                name="scale",
                shape=[1],
                dtype='float32',
                append_batch_size=False,
            )
2
201716010711 已提交
2444
            out = paddle.scale(input, scale=scale_var)
2445 2446
            return out

2447
    def make_bilinear_tensor_product_layer(self):
2448 2449 2450
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2451 2452 2453
            data = self._get_data(name='data', shape=[4], dtype="float32")

            theta = self._get_data(name="theta", shape=[5], dtype="float32")
2454 2455 2456
            out = paddle.static.nn.common.bilinear_tensor_product(
                data, theta, 6
            )
2457
            return out
2458 2459

    def make_batch_norm(self):
2460 2461 2462 2463 2464 2465
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            data = self._get_data(
                name='data', shape=[32, 128, 128], dtype="float32"
            )
2466
            out = paddle.static.nn.batch_norm(data)
2467
            return out
2468

2469
    def make_batch_norm_momentum_variable(self):
2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            data = self._get_data(
                name='data', shape=[32, 128, 128], dtype="float32"
            )
            momentum = self._get_data(
                name='momentum',
                shape=[1],
                dtype='float32',
                append_batch_size=False,
            )
2482
            out = paddle.static.nn.batch_norm(data, momentum=momentum)
2483
            return out
2484

2485
    def make_range(self):
2486 2487 2488
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
C
ccrrong 已提交
2489 2490 2491
            paddle.arange(0, 10, 2, 'int32')
            paddle.arange(0.1, 10.0, 0.2, 'float32')
            paddle.arange(0.1, 10.0, 0.2, 'float64')
2492 2493 2494
            start = layers.fill_constant(shape=[1], value=0.1, dtype="float32")
            end = layers.fill_constant(shape=[1], value=10.0, dtype="float32")
            step = layers.fill_constant(shape=[1], value=0.2, dtype="float32")
C
ccrrong 已提交
2495
            y = paddle.arange(start, end, step, 'float64')
2496 2497 2498
            return y

    def make_spectral_norm(self):
2499 2500 2501 2502 2503 2504 2505 2506 2507
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            weight = self._get_data(
                name='weight',
                shape=[2, 3, 32, 32],
                dtype="float32",
                append_batch_size=False,
            )
2508
            out = layers.spectral_norm(weight, dim=1, power_iters=1)
2509
            return out
2510 2511

    def make_kldiv_loss(self):
2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            x = self._get_data(
                name='x',
                shape=[32, 128, 128],
                dtype="float32",
                append_batch_size=False,
            )
            target = self._get_data(
                name='target',
                shape=[32, 128, 128],
                dtype="float32",
                append_batch_size=False,
            )
2527 2528 2529
            loss = paddle.nn.functional.kl_div(
                input=x, label=target, reduction='batchmean'
            )
2530
            return loss
2531

M
minqiyang 已提交
2532
    def make_pixel_shuffle(self):
2533 2534 2535
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
M
minqiyang 已提交
2536
            x = self._get_data(name="X", shape=[9, 4, 4], dtype="float32")
2537
            out = paddle.nn.functional.pixel_shuffle(x, upscale_factor=3)
2538
            return out
M
minqiyang 已提交
2539

R
ruri 已提交
2540
    def make_mse_loss(self):
2541 2542 2543
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
R
ruri 已提交
2544 2545
            x = self._get_data(name="X", shape=[1], dtype="float32")
            y = self._get_data(name="Y", shape=[1], dtype="float32")
2546
            out = paddle.nn.functional.mse_loss(input=x, label=y)
2547
            return out
R
ruri 已提交
2548

2549
    def make_square_error_cost(self):
2550 2551 2552
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
2553 2554
            x = self._get_data(name="X", shape=[1], dtype="float32")
            y = self._get_data(name="Y", shape=[1], dtype="float32")
2555
            out = paddle.nn.functional.square_error_cost(input=x, label=y)
2556
            return out
2557

2558 2559 2560 2561
    def test_dynamic_lstmp(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            hidden_dim, proj_dim = 16, 8
2562 2563 2564
            seq_data = layers.data(
                name='seq_data', shape=[10, 10], dtype='float32', lod_level=1
            )
2565 2566
            fc_out = layers.fc(input=seq_data, size=4 * hidden_dim)
            self.assertIsNotNone(
2567 2568 2569 2570
                layers.dynamic_lstmp(
                    input=fc_out, size=4 * hidden_dim, proj_size=proj_dim
                )
            )
2571 2572 2573 2574

    def test_lod_reset(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
2575
            # case 1
2576
            x = layers.data(name='x', shape=[10], dtype='float32')
2577 2578 2579
            y = layers.data(
                name='y', shape=[10, 20], dtype='float32', lod_level=2
            )
2580 2581 2582
            z = layers.lod_reset(x=x, y=y)
            self.assertTrue(z.lod_level == 2)
            # case 2
2583
            lod_tensor_in = layers.data(name='lod_in', shape=[1], dtype='int32')
2584 2585 2586 2587 2588 2589
            z = layers.lod_reset(x=x, y=lod_tensor_in)
            self.assertTrue(z.lod_level == 1)
            # case 3
            z = layers.lod_reset(x=x, target_lod=[1, 2, 3])
            self.assertTrue(z.lod_level == 1)
            return z
2590

W
whs 已提交
2591
    def test_affine_grid(self):
2592
        with self.static_graph():
W
whs 已提交
2593
            data = layers.data(name='data', shape=[2, 3, 3], dtype="float32")
2594
            out = paddle.argsort(x=data, axis=1)
W
whs 已提交
2595 2596

            theta = layers.data(name="theta", shape=[2, 3], dtype="float32")
2597
            out_shape = layers.data(name="out_shape", shape=[-1], dtype="int32")
2598 2599
            data_0 = paddle.nn.functional.affine_grid(theta, out_shape)
            data_1 = paddle.nn.functional.affine_grid(theta, [5, 3, 28, 28])
W
whs 已提交
2600 2601 2602

            self.assertIsNotNone(data_0)
            self.assertIsNotNone(data_1)
D
dengkaipeng 已提交
2603

W
wangchaochaohu 已提交
2604 2605 2606 2607 2608 2609 2610
    def test_stridedslice(self):
        axes = [0, 1, 2]
        starts = [1, 0, 2]
        ends = [3, 3, 4]
        strides = [1, 1, 1]
        with self.static_graph():
            x = layers.data(name="x", shape=[245, 30, 30], dtype="float32")
2
201716010711 已提交
2611
            out = paddle.strided_slice(
2612 2613
                x, axes=axes, starts=starts, ends=ends, strides=strides
            )
W
wangchaochaohu 已提交
2614 2615
            return out

2616 2617
    def test_fill_constant_batch_size_like(self):
        with self.static_graph():
2618 2619 2620 2621 2622 2623
            like = fluid.layers.fill_constant(
                shape=[1, 200], value=10, dtype='int64'
            )
            out = layers.fill_constant_batch_size_like(
                input=like, shape=[2, 3300], value=1315454564656, dtype='int64'
            )
2624 2625
            return out

2626 2627 2628 2629
    def test_sequence_expand(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name='x', shape=[10], dtype='float32')
2630 2631 2632 2633
            y = layers.data(
                name='y', shape=[10, 20], dtype='float32', lod_level=2
            )
            return layers.sequence_expand(x=x, y=y, ref_level=1)
2634

2635 2636 2637 2638 2639
    def test_sequence_reshape(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name='x', shape=[8], dtype='float32', lod_level=1)
            out = layers.sequence_reshape(input=x, new_dim=16)
2640
            return out
2641

2642 2643 2644 2645
    def test_sequence_unpad(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name='x', shape=[10, 5], dtype='float32')
2646
            length = layers.data(name='length', shape=[], dtype='int64')
2647
            return layers.sequence_unpad(x=x, length=length)
2648

2649 2650 2651
    def test_sequence_softmax(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
2652 2653 2654
            seq_data = layers.data(
                name='seq_data', shape=[10, 10], dtype='float32', lod_level=1
            )
2655
            seq = layers.fc(input=seq_data, size=20)
2656
            return layers.sequence_softmax(seq)
2657

2658 2659 2660 2661 2662
    def test_sequence_unsqueeze(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name='x', shape=[8, 2], dtype='float32')
            out = layers.unsqueeze(input=x, axes=[1])
2663
            return out
2664

2665 2666 2667
    def test_sequence_scatter(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684
            x = layers.data(
                name='x', shape=[3, 6], append_batch_size=False, dtype='float32'
            )
            idx = layers.data(
                name='idx',
                shape=[12, 1],
                append_batch_size=False,
                dtype='int32',
                lod_level=1,
            )
            updates = layers.data(
                name='updates',
                shape=[12, 1],
                append_batch_size=False,
                dtype='float32',
                lod_level=1,
            )
2685
            out = layers.sequence_scatter(input=x, index=idx, updates=updates)
2686
            return out
W
whs 已提交
2687

2688 2689 2690 2691
    def test_sequence_slice(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            import numpy as np
2692 2693 2694 2695

            seqs = layers.data(
                name='x', shape=[10, 5], dtype='float32', lod_level=1
            )
2696 2697
            offset = layers.assign(input=np.array([[0, 1]]).astype('int32'))
            length = layers.assign(input=np.array([[2, 1]]).astype('int32'))
2698 2699 2700 2701
            out = layers.sequence_slice(
                input=seqs, offset=offset, length=length
            )
            return out
W
whs 已提交
2702

Z
zhoushiyu 已提交
2703 2704 2705
    def test_shuffle_batch(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
2706 2707 2708
            x = layers.data(
                name='X', shape=[4, 50], dtype='float32', lod_level=0
            )
Z
zhoushiyu 已提交
2709 2710 2711 2712 2713
            out1 = fluid.contrib.layers.shuffle_batch(x)
            default_main_program().random_seed = 1000
            out2 = fluid.contrib.layers.shuffle_batch(x)
            self.assertIsNotNone(out1)
            self.assertIsNotNone(out2)
2714
            return out1
Z
zhoushiyu 已提交
2715

2716 2717 2718 2719
    def test_partial_sum(self):
        with self.static_graph():
            x = fluid.data(name="x", shape=[None, 3], dtype="float32")
            y = fluid.data(name="y", shape=[None, 3], dtype="float32")
2720 2721 2722 2723
            sum = fluid.contrib.layers.partial_sum(
                [x, y], start_index=0, length=2
            )
            return sum
2724

S
ShenLiang 已提交
2725 2726 2727 2728 2729 2730 2731 2732 2733
    def test_batch_fc(self):
        with self.static_graph():
            input = fluid.data(name="input", shape=[16, 2, 3], dtype="float32")
            out = fluid.contrib.layers.batch_fc(
                input=input,
                param_size=[16, 3, 10],
                param_attr=fluid.ParamAttr(
                    learning_rate=1.0,
                    name="w_0",
2734 2735
                    initializer=fluid.initializer.Xavier(uniform=False),
                ),
S
ShenLiang 已提交
2736 2737 2738 2739
                bias_size=[16, 10],
                bias_attr=fluid.ParamAttr(
                    learning_rate=1.0,
                    name="b_0",
2740 2741 2742 2743 2744
                    initializer=fluid.initializer.Xavier(uniform=False),
                ),
                act="relu",
            )
        return out
S
ShenLiang 已提交
2745

S
ShenLiang 已提交
2746 2747 2748
    def test_rank_attention(self):
        with self.static_graph():
            input = fluid.data(name="input", shape=[None, 2], dtype="float32")
2749 2750 2751
            rank_offset = fluid.data(
                name="rank_offset", shape=[None, 7], dtype="int32"
            )
S
ShenLiang 已提交
2752 2753 2754 2755 2756 2757 2758
            out = fluid.contrib.layers.rank_attention(
                input=input,
                rank_offset=rank_offset,
                rank_param_shape=[18, 3],
                rank_param_attr=fluid.ParamAttr(
                    learning_rate=1.0,
                    name="ubm_rank_param.w_0",
2759 2760 2761 2762 2763
                    initializer=fluid.initializer.Xavier(uniform=False),
                ),
                max_rank=3,
            )
            return out
S
ShenLiang 已提交
2764

2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
    def test_sequence_enumerate(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name="input", shape=[1], dtype='int32', lod_level=1)
            out = layers.sequence_enumerate(input=x, win_size=2, pad_value=0)

    def test_roi_perspective_transform(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name="x", shape=[256, 30, 30], dtype="float32")
2775 2776 2777
            rois = layers.data(
                name="rois", shape=[8], dtype="float32", lod_level=1
            )
2778
            output = layers.roi_perspective_transform(x, rois, 7, 7, 0.6)
2779
            return output
2780 2781 2782 2783 2784 2785

    def test_row_conv(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
            x = layers.data(name='x', shape=[16], dtype='float32', lod_level=1)
            out = layers.row_conv(input=x, future_context_size=2)
2786
            return out
2787 2788 2789 2790

    def test_simple_conv2d(self):
        # TODO(minqiyang): dygraph do not support layers with param now
        with self.static_graph():
2791 2792 2793 2794 2795 2796
            images = layers.data(
                name='pixel', shape=[3, 48, 48], dtype='float32'
            )
            return layers.conv2d(
                input=images, num_filters=3, filter_size=[4, 4]
            )
2797 2798 2799 2800 2801

    def test_squeeze(self):
        # TODO(minqiyang): dygraph do not support layers with param now
        with self.static_graph():
            x = layers.data(name='x', shape=[1, 1, 4], dtype='float32')
2802
            out = paddle.squeeze(x, axis=[2])
2803
            return out
2804 2805 2806 2807

    def test_flatten(self):
        # TODO(minqiyang): dygraph do not support op without kernel now
        with self.static_graph():
2808 2809 2810 2811 2812 2813
            x = layers.data(
                name='x',
                append_batch_size=False,
                shape=[4, 4, 3],
                dtype="float32",
            )
2814
            out = paddle.flatten(x, 1, -1, name="flatten")
2815
            return out
2816

Z
zhoukunsheng 已提交
2817 2818 2819
    def test_linspace(self):
        program = Program()
        with program_guard(program):
2820
            out = paddle.linspace(20, 10, 5, 'float64')
Z
zhoukunsheng 已提交
2821 2822 2823
            self.assertIsNotNone(out)
        print(str(program))

2824 2825 2826
    def test_unfold(self):
        with self.static_graph():
            x = layers.data(name='x', shape=[3, 20, 20], dtype='float32')
2827
            out = paddle.nn.functional.unfold(x, [3, 3], 1, 1, 1)
2828
            return out
2829

2830 2831 2832 2833
    def test_partial_concat(self):
        with self.static_graph():
            x = fluid.data(name="x", shape=[None, 3], dtype="float32")
            y = fluid.data(name="y", shape=[None, 3], dtype="float32")
2834 2835 2836 2837 2838 2839
            concat1 = fluid.contrib.layers.partial_concat(
                [x, y], start_index=0, length=2
            )
            concat2 = fluid.contrib.layers.partial_concat(
                x, start_index=0, length=-1
            )
2840 2841
            return concat1, concat2

2842
    def test_addmm(self):
2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            input = layers.data(
                name='input_data',
                shape=[3, 3],
                append_batch_size=False,
                dtype='float32',
            )
            x = layers.data(
                name='x', shape=[3, 2], append_batch_size=False, dtype='float32'
            )
            y = layers.data(
                name='y', shape=[2, 3], append_batch_size=False, dtype='float32'
            )
2858 2859

            out = paddle.addmm(input=input, x=x, y=y)
2860
            return out
2861

2862
    def test_retinanet_detection_output(self):
2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889
        with program_guard(
            fluid.default_main_program(), fluid.default_startup_program()
        ):
            bboxes = layers.data(
                name='bboxes',
                shape=[1, 21, 4],
                append_batch_size=False,
                dtype='float32',
            )
            scores = layers.data(
                name='scores',
                shape=[1, 21, 10],
                append_batch_size=False,
                dtype='float32',
            )
            anchors = layers.data(
                name='anchors',
                shape=[21, 4],
                append_batch_size=False,
                dtype='float32',
            )
            im_info = layers.data(
                name="im_info",
                shape=[1, 3],
                append_batch_size=False,
                dtype='float32',
            )
2890 2891 2892 2893 2894 2895 2896 2897 2898
            nmsed_outs = layers.retinanet_detection_output(
                bboxes=[bboxes, bboxes],
                scores=[scores, scores],
                anchors=[anchors, anchors],
                im_info=im_info,
                score_threshold=0.05,
                nms_top_k=1000,
                keep_top_k=100,
                nms_threshold=0.3,
2899 2900 2901
                nms_eta=1.0,
            )
            return nmsed_outs
2902

2903 2904 2905
    def test_warpctc_with_padding(self):
        # TODO(minqiyang): dygraph do not support lod now
        with self.static_graph():
2906
            input_length = paddle.static.data(
2907 2908
                name='logits_length', shape=[11], dtype='int64'
            )
2909
            label_length = paddle.static.data(
2910 2911
                name='labels_length', shape=[12], dtype='int64'
            )
2912 2913 2914 2915
            label = paddle.static.data(
                name='label', shape=[12, 1], dtype='int32'
            )
            predict = paddle.static.data(
2916 2917
                name='predict', shape=[4, 4, 8], dtype='float32'
            )
2918 2919 2920 2921 2922 2923
            output = paddle.nn.functional.ctc_loss(
                log_probs=predict,
                labels=label,
                input_lengths=input_length,
                label_lengths=label_length,
                reduction='none',
2924 2925
            )
            return output
2926

2927 2928 2929 2930
    def test_basic_gru(self):
        input_size = 128
        hidden_size = 256
        with self.static_graph():
2931 2932 2933 2934 2935 2936 2937 2938 2939
            input = fluid.data(
                name="input", shape=[None, None, input_size], dtype='float32'
            )
            pre_hidden = fluid.data(
                name="pre_hidden", shape=[None, hidden_size], dtype='float32'
            )
            sequence_length = fluid.data(
                name="sequence_length", shape=[None], dtype='int32'
            )
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950

            for bidirectional in [True, False]:
                for batch_first in [True, False]:
                    rnn_out, last_hidden = fluid.contrib.layers.basic_gru(
                        input,
                        pre_hidden,
                        hidden_size=256,
                        num_layers=2,
                        sequence_length=sequence_length,
                        dropout_prob=0.5,
                        bidirectional=bidirectional,
2951 2952
                        batch_first=batch_first,
                    )
2953

Y
Yu Yang 已提交
2954

2955 2956
class ExampleNet(paddle.nn.Layer):
    def __init__(self):
2957
        super().__init__()
2958
        self.weight = self.create_parameter(
2959 2960
            shape=[1, 1], attr=paddle.ParamAttr(trainable=False)
        )
2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973

    def forward(self):
        # only for test parameter trainable attr
        pass


class TestLayerParameterTrainableSet(unittest.TestCase):
    def test_layer_parameter_set(self):
        with fluid.dygraph.guard():
            net = ExampleNet()
            self.assertFalse(net.weight.trainable)


2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990
class TestLayerTrainingAttribute(unittest.TestCase):
    def test_set_train_eval_in_dynamic_mode(self):
        with fluid.dygraph.guard():
            net = paddle.nn.Dropout()
            net.train()
            self.assertTrue(net.training)
            net.eval()
            self.assertFalse(net.training)

    def test_set_train_eval_in_static_mode(self):
        net = paddle.nn.Dropout()
        net.train()
        self.assertTrue(net.training)
        net.eval()
        self.assertFalse(net.training)


J
Jiabin Yang 已提交
2991 2992
class MyLayer(paddle.nn.Layer):
    def __init__(self):
2993
        super().__init__()
J
Jiabin Yang 已提交
2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004
        self._linear = paddle.nn.Linear(1, 1)
        self._dropout = paddle.nn.Dropout(p=0.5)

    def forward(self, input):
        temp = self._linear(input)
        temp = self._dropout(temp)
        return temp


class MySuperLayer(paddle.nn.Layer):
    def __init__(self):
3005
        super().__init__()
J
Jiabin Yang 已提交
3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020
        self._mylayer = MyLayer()

    def forward(self, input):
        temp = self._mylayer(input)
        return temp


class TestSubLayerCount(unittest.TestCase):
    def test_sublayer(self):
        with fluid.dygraph.guard():
            mySuperlayer = MySuperLayer()
            self.assertTrue(len(mySuperlayer.sublayers()) == 3)
            self.assertTrue(len(mySuperlayer.sublayers(include_self=True)) == 4)


Y
Yu Yang 已提交
3021
if __name__ == '__main__':
3022
    paddle.enable_static()
Y
Yu Yang 已提交
3023
    unittest.main()