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

15 16
from __future__ import print_function

Y
Yu Yang 已提交
17
import unittest
18
from paddle.fluid.framework import default_main_program, Program, convert_np_dtype_to_dtype_, in_dygraph_mode
W
wopeizl 已提交
19
import paddle.fluid as fluid
20
import paddle.fluid.layers as layers
21
import paddle.fluid.core as core
Y
Yu Yang 已提交
22 23 24 25 26
import numpy as np


class TestVariable(unittest.TestCase):
    def test_np_dtype_convert(self):
27
        DT = core.VarDesc.VarType
28
        convert = convert_np_dtype_to_dtype_
Y
Yu Yang 已提交
29 30 31 32 33 34 35
        self.assertEqual(DT.FP32, convert(np.float32))
        self.assertEqual(DT.FP16, convert("float16"))
        self.assertEqual(DT.FP64, convert("float64"))
        self.assertEqual(DT.INT32, convert("int32"))
        self.assertEqual(DT.INT16, convert("int16"))
        self.assertEqual(DT.INT64, convert("int64"))
        self.assertEqual(DT.BOOL, convert("bool"))
Q
qingqing01 已提交
36 37
        self.assertEqual(DT.INT8, convert("int8"))
        self.assertEqual(DT.UINT8, convert("uint8"))
Y
Yu Yang 已提交
38

Y
Yu Yang 已提交
39
    def test_var(self):
Y
Yu Yang 已提交
40
        b = default_main_program().current_block()
Y
Yu Yang 已提交
41 42
        w = b.create_var(
            dtype="float64", shape=[784, 100], lod_level=0, name="fc.w")
43
        self.assertNotEqual(str(w), "")
44
        self.assertEqual(core.VarDesc.VarType.FP64, w.dtype)
Y
Yu Yang 已提交
45 46 47 48 49
        self.assertEqual((784, 100), w.shape)
        self.assertEqual("fc.w", w.name)
        self.assertEqual(0, w.lod_level)

        w = b.create_var(name='fc.w')
50
        self.assertEqual(core.VarDesc.VarType.FP64, w.dtype)
Y
Yu Yang 已提交
51 52 53 54 55 56 57
        self.assertEqual((784, 100), w.shape)
        self.assertEqual("fc.w", w.name)
        self.assertEqual(0, w.lod_level)

        self.assertRaises(ValueError,
                          lambda: b.create_var(name="fc.w", shape=(24, 100)))

Y
Yu Yang 已提交
58 59 60 61 62 63 64
    def test_step_scopes(self):
        prog = Program()
        b = prog.current_block()
        var = b.create_var(
            name='step_scopes', type=core.VarDesc.VarType.STEP_SCOPES)
        self.assertEqual(core.VarDesc.VarType.STEP_SCOPES, var.type)

W
wopeizl 已提交
65
    def _test_slice(self, place):
W
wopeizl 已提交
66 67 68 69 70
        b = default_main_program().current_block()
        w = b.create_var(dtype="float64", shape=[784, 100, 100], lod_level=0)

        for i in range(3):
            nw = w[i]
71
            self.assertEqual((100, 100), nw.shape)
W
wopeizl 已提交
72 73 74 75

        nw = w[:]
        self.assertEqual((784, 100, 100), nw.shape)

76
        nw = w[:, :]
W
wopeizl 已提交
77 78
        self.assertEqual((784, 100, 100), nw.shape)

79 80
        nw = w[:, :, -1]
        self.assertEqual((784, 100), nw.shape)
W
wopeizl 已提交
81

82 83 84 85 86 87 88
        nw = w[1, 1, 1]

        self.assertEqual(len(nw.shape), 1)
        self.assertEqual(nw.shape[0], 1)

        nw = w[:, :, :-1]
        self.assertEqual((784, 100, 99), nw.shape)
W
wopeizl 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102

        self.assertEqual(0, nw.lod_level)

        main = fluid.Program()
        with fluid.program_guard(main):
            exe = fluid.Executor(place)
            tensor_array = np.array(
                [[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                 [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
                 [[19, 20, 21], [22, 23, 24], [25, 26, 27]]]).astype('float32')
            var = fluid.layers.assign(tensor_array)
            var1 = var[0, 1, 1]
            var2 = var[1:]
            var3 = var[0:1]
103 104
            var4 = var[::-1]
            var5 = var[1, 1:, 1:]
W
wopeizl 已提交
105
            var_reshape = fluid.layers.reshape(var, [3, -1, 3])
106 107 108 109 110 111 112 113 114 115
            var6 = var_reshape[:, :, -1]
            var7 = var[:, :, :-1]
            var8 = var[:1, :1, :1]
            var9 = var[:-1, :-1, :-1]
            var10 = var[::-1, :1, :-1]
            var11 = var[:-1, ::-1, -1:]
            var12 = var[1:2, 2:, ::-1]
            var13 = var[2:10, 2:, -2:-1]
            var14 = var[1:-1, 0:2, ::-1]
            var15 = var[::-1, ::-1, ::-1]
W
wopeizl 已提交
116 117 118

            x = fluid.layers.data(name='x', shape=[13], dtype='float32')
            y = fluid.layers.fc(input=x, size=1, act=None)
119
            y_1 = y[:, 0]
W
wopeizl 已提交
120 121 122 123 124
            feeder = fluid.DataFeeder(place=place, feed_list=[x])
            data = []
            data.append((np.random.randint(10, size=[13]).astype('float32')))
            exe.run(fluid.default_startup_program())

W
wopeizl 已提交
125
            local_out = exe.run(main,
W
wopeizl 已提交
126
                                feed=feeder.feed([data]),
W
wopeizl 已提交
127 128
                                fetch_list=[
                                    var, var1, var2, var3, var4, var5, var6,
129 130
                                    var7, var8, var9, var10, var11, var12,
                                    var13, var14, var15
W
wopeizl 已提交
131 132
                                ])

133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
            self.assertTrue(
                np.array_equal(local_out[1], tensor_array[0, 1, 1:2]))
            self.assertTrue(np.array_equal(local_out[2], tensor_array[1:]))
            self.assertTrue(np.array_equal(local_out[3], tensor_array[0:1]))
            self.assertTrue(np.array_equal(local_out[4], tensor_array[::-1]))
            self.assertTrue(
                np.array_equal(local_out[5], tensor_array[1, 1:, 1:]))
            self.assertTrue(
                np.array_equal(local_out[6],
                               tensor_array.reshape((3, -1, 3))[:, :, -1]))
            self.assertTrue(
                np.array_equal(local_out[7], tensor_array[:, :, :-1]))
            self.assertTrue(
                np.array_equal(local_out[8], tensor_array[:1, :1, :1]))
            self.assertTrue(
                np.array_equal(local_out[9], tensor_array[:-1, :-1, :-1]))
            self.assertTrue(
                np.array_equal(local_out[10], tensor_array[::-1, :1, :-1]))
            self.assertTrue(
                np.array_equal(local_out[11], tensor_array[:-1, ::-1, -1:]))
            self.assertTrue(
                np.array_equal(local_out[12], tensor_array[1:2, 2:, ::-1]))
            self.assertTrue(
                np.array_equal(local_out[13], tensor_array[2:10, 2:, -2:-1]))
            self.assertTrue(
                np.array_equal(local_out[14], tensor_array[1:-1, 0:2, ::-1]))
            self.assertTrue(
                np.array_equal(local_out[15], tensor_array[::-1, ::-1, ::-1]))
W
wopeizl 已提交
161 162

    def test_slice(self):
W
wopeizl 已提交
163 164
        place = fluid.CPUPlace()
        self._test_slice(place)
W
wopeizl 已提交
165

W
wopeizl 已提交
166 167
        if core.is_compiled_with_cuda():
            self._test_slice(core.CUDAPlace(0))
W
wopeizl 已提交
168

169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
    def _tostring(self):
        b = default_main_program().current_block()
        w = b.create_var(dtype="float64", lod_level=0)
        self.assertTrue(isinstance(str(w), str))

        if core.is_compiled_with_cuda():
            wc = b.create_var(dtype="int", lod_level=0)
            self.assertTrue(isinstance(str(wc), str))

    def test_tostring(self):
        with fluid.dygraph.guard():
            self._tostring()

        with fluid.program_guard(default_main_program()):
            self._tostring()

Y
Yu Yang 已提交
185 186 187

if __name__ == '__main__':
    unittest.main()