test_pool2d_op.py 11.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.

C
chengduoZH 已提交
15 16
import unittest
import numpy as np
17

18
import paddle.fluid.core as core
C
chengduoZH 已提交
19 20 21
from op_test import OpTest


22 23 24 25 26 27
def max_pool2D_forward_naive(x,
                             ksize,
                             strides,
                             paddings,
                             global_pool=0,
                             ceil_mode=False):
C
chengduoZH 已提交
28
    N, C, H, W = x.shape
C
chengduoZH 已提交
29 30
    if global_pool == 1:
        ksize = [H, W]
31 32 33 34 35 36
    H_out = (H - ksize[0] + 2 * paddings[0] + strides[0] - 1
             ) / strides[0] + 1 if ceil_mode else (H - ksize[0] + 2 *
                                                   paddings[0]) / strides[0] + 1
    W_out = (W - ksize[1] + 2 * paddings[1] + strides[1] - 1
             ) / strides[1] + 1 if ceil_mode else (W - ksize[1] + 2 *
                                                   paddings[1]) / strides[1] + 1
C
chengduoZH 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49
    out = np.zeros((N, C, H_out, W_out))
    for i in xrange(H_out):
        for j in xrange(W_out):
            r_start = np.max((i * strides[0] - paddings[0], 0))
            r_end = np.min((i * strides[0] + ksize[0] - paddings[0], H))
            c_start = np.max((j * strides[1] - paddings[1], 0))
            c_end = np.min((j * strides[1] + ksize[1] - paddings[1], W))
            x_masked = x[:, :, r_start:r_end, c_start:c_end]

            out[:, :, i, j] = np.max(x_masked, axis=(2, 3))
    return out


50 51 52 53 54 55
def avg_pool2D_forward_naive(x,
                             ksize,
                             strides,
                             paddings,
                             global_pool=0,
                             ceil_mode=False):
C
chengduoZH 已提交
56
    N, C, H, W = x.shape
C
chengduoZH 已提交
57 58
    if global_pool == 1:
        ksize = [H, W]
59 60 61 62 63 64
    H_out = (H - ksize[0] + 2 * paddings[0] + strides[0] - 1
             ) / strides[0] + 1 if ceil_mode else (H - ksize[0] + 2 *
                                                   paddings[0]) / strides[0] + 1
    W_out = (W - ksize[1] + 2 * paddings[1] + strides[1] - 1
             ) / strides[1] + 1 if ceil_mode else (W - ksize[1] + 2 *
                                                   paddings[1]) / strides[1] + 1
C
chengduoZH 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    out = np.zeros((N, C, H_out, W_out))
    for i in xrange(H_out):
        for j in xrange(W_out):
            r_start = np.max((i * strides[0] - paddings[0], 0))
            r_end = np.min((i * strides[0] + ksize[0] - paddings[0], H))
            c_start = np.max((j * strides[1] - paddings[1], 0))
            c_end = np.min((j * strides[1] + ksize[1] - paddings[1], W))
            x_masked = x[:, :, r_start:r_end, c_start:c_end]

            out[:, :, i, j] = np.sum(x_masked, axis=(2, 3)) / (
                (r_end - r_start) * (c_end - c_start))
    return out


class TestPool2d_Op(OpTest):
    def setUp(self):
81
        self.use_cudnn = False
82
        self.use_mkldnn = False
K
Kexin Zhao 已提交
83
        self.dtype = np.float32
C
chengduoZH 已提交
84
        self.init_test_case()
C
chengduoZH 已提交
85
        self.init_global_pool()
C
chengduoZH 已提交
86 87
        self.init_op_type()
        self.init_pool_type()
88
        self.init_ceil_mode()
C
fix bug  
chengduoZH 已提交
89 90
        if self.global_pool:
            self.paddings = [0 for _ in range(len(self.paddings))]
K
Kexin Zhao 已提交
91
        input = np.random.random(self.shape).astype(self.dtype)
C
chengduoZH 已提交
92
        output = self.pool2D_forward_naive(input, self.ksize, self.strides,
93
                                           self.paddings, self.global_pool,
K
Kexin Zhao 已提交
94 95
                                           self.ceil_mode).astype(self.dtype)
        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(input)}
C
chengduoZH 已提交
96 97 98 99 100

        self.attrs = {
            'strides': self.strides,
            'paddings': self.paddings,
            'ksize': self.ksize,
C
chengduoZH 已提交
101 102
            'pooling_type': self.pool_type,
            'global_pooling': self.global_pool,
103
            'use_cudnn': self.use_cudnn,
104
            'use_mkldnn': self.use_mkldnn,
105
            'ceil_mode': self.ceil_mode,
106
            'data_format': 'AnyLayout'  # TODO(dzhwinter) : should be fix latter
C
chengduoZH 已提交
107 108
        }

K
Kexin Zhao 已提交
109
        self.outputs = {'Out': output}
C
chengduoZH 已提交
110 111

    def test_check_output(self):
112 113 114 115 116
        if self.use_cudnn:
            place = core.CUDAPlace(0)
            self.check_output_with_place(place, atol=1e-5)
        else:
            self.check_output()
C
chengduoZH 已提交
117 118

    def test_check_grad(self):
K
Kexin Zhao 已提交
119 120
        if self.dtype == np.float16:
            return
121 122 123 124 125
        if self.use_cudnn and self.pool_type != "max":
            place = core.CUDAPlace(0)
            self.check_grad_with_place(
                place, set(['X']), 'Out', max_relative_error=0.07)
        elif self.pool_type != "max":
126
            self.check_grad(set(['X']), 'Out', max_relative_error=0.07)
C
chengduoZH 已提交
127

C
chengduoZH 已提交
128
    def init_test_case(self):
C
chengduoZH 已提交
129 130 131 132 133
        self.shape = [2, 3, 5, 5]
        self.ksize = [3, 3]
        self.strides = [1, 1]
        self.paddings = [0, 0]

C
chengduoZH 已提交
134 135 136 137 138
    def init_op_type(self):
        self.op_type = "pool2d"

    def init_pool_type(self):
        self.pool_type = "avg"
C
chengduoZH 已提交
139 140 141 142
        self.pool2D_forward_naive = avg_pool2D_forward_naive

    def init_global_pool(self):
        self.global_pool = True
C
chengduoZH 已提交
143

144 145 146
    def init_ceil_mode(self):
        self.ceil_mode = False

C
chengduoZH 已提交
147

C
chengduoZH 已提交
148
class TestCase1(TestPool2d_Op):
C
chengduoZH 已提交
149
    def init_test_case(self):
C
chengduoZH 已提交
150
        self.shape = [2, 3, 7, 7]
C
chengduoZH 已提交
151 152
        self.ksize = [3, 3]
        self.strides = [1, 1]
C
chengduoZH 已提交
153
        self.paddings = [0, 0]
C
chengduoZH 已提交
154

C
chengduoZH 已提交
155 156 157 158 159
    def init_op_type(self):
        self.op_type = "pool2d"

    def init_pool_type(self):
        self.pool_type = "avg"
C
chengduoZH 已提交
160 161 162 163
        self.pool2D_forward_naive = avg_pool2D_forward_naive

    def init_global_pool(self):
        self.global_pool = False
C
chengduoZH 已提交
164

C
chengduoZH 已提交
165

C
chengduoZH 已提交
166
class TestCase2(TestPool2d_Op):
C
chengduoZH 已提交
167
    def init_test_case(self):
C
chengduoZH 已提交
168
        self.shape = [2, 3, 7, 7]
C
chengduoZH 已提交
169 170 171 172
        self.ksize = [3, 3]
        self.strides = [1, 1]
        self.paddings = [1, 1]

C
chengduoZH 已提交
173 174 175 176 177
    def init_op_type(self):
        self.op_type = "pool2d"

    def init_pool_type(self):
        self.pool_type = "avg"
C
chengduoZH 已提交
178
        self.pool2D_forward_naive = avg_pool2D_forward_naive
C
chengduoZH 已提交
179

C
chengduoZH 已提交
180 181
    def init_global_pool(self):
        self.global_pool = False
C
chengduoZH 已提交
182

C
chengduoZH 已提交
183

C
chengduoZH 已提交
184
class TestCase3(TestPool2d_Op):
C
chengduoZH 已提交
185 186 187 188 189
    def init_op_type(self):
        self.op_type = "pool2d"

    def init_pool_type(self):
        self.pool_type = "max"
C
chengduoZH 已提交
190
        self.pool2D_forward_naive = max_pool2D_forward_naive
C
chengduoZH 已提交
191

C
chengduoZH 已提交
192 193

class TestCase4(TestCase1):
C
chengduoZH 已提交
194 195 196 197 198 199 200
    def init_op_type(self):
        self.op_type = "pool2d"

    def init_pool_type(self):
        self.pool_type = "max"
        self.pool2D_forward_naive = max_pool2D_forward_naive

C
chengduoZH 已提交
201 202

class TestCase5(TestCase2):
C
chengduoZH 已提交
203
    def init_op_type(self):
C
chengduoZH 已提交
204
        self.op_type = "pool2d"
C
chengduoZH 已提交
205 206 207

    def init_pool_type(self):
        self.pool_type = "max"
C
chengduoZH 已提交
208
        self.pool2D_forward_naive = max_pool2D_forward_naive
C
chengduoZH 已提交
209 210


211 212
#--------------------test pool2d--------------------
class TestCUDNNCase1(TestPool2d_Op):
C
chengduoZH 已提交
213
    def init_op_type(self):
214 215
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
216 217


K
Kexin Zhao 已提交
218 219 220 221 222 223 224 225 226 227 228 229 230
class TestFP16CUDNNCase1(TestPool2d_Op):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


231
class TestCUDNNCase2(TestCase1):
C
chengduoZH 已提交
232
    def init_op_type(self):
233 234
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
235 236


K
Kexin Zhao 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249
class TestFP16CUDNNCase2(TestCase1):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


250
class TestCUDNNCase3(TestCase2):
C
chengduoZH 已提交
251
    def init_op_type(self):
252 253
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
254 255


K
Kexin Zhao 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268
class TestFP16CUDNNCase3(TestCase2):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


269
class TestCUDNNCase4(TestCase3):
C
chengduoZH 已提交
270
    def init_op_type(self):
271 272
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
273 274


K
Kexin Zhao 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287
class TestFP16CUDNNCase4(TestCase3):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


288
class TestCUDNNCase5(TestCase4):
C
chengduoZH 已提交
289
    def init_op_type(self):
290 291
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
292

C
chengduoZH 已提交
293

K
Kexin Zhao 已提交
294 295 296 297 298 299 300 301 302 303 304 305 306
class TestFP16CUDNNCase5(TestCase4):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


307
class TestCUDNNCase6(TestCase5):
C
chengduoZH 已提交
308
    def init_op_type(self):
309 310
        self.use_cudnn = True
        self.op_type = "pool2d"
C
chengduoZH 已提交
311

C
chengduoZH 已提交
312

K
Kexin Zhao 已提交
313 314 315 316 317 318 319 320 321 322 323 324 325
class TestFP16CUDNNCase6(TestCase5):
    def init_op_type(self):
        self.use_cudnn = True
        self.op_type = "pool2d"
        self.dtype = np.float16

    def test_check_output(self):
        if core.is_compiled_with_cuda():
            place = core.CUDAPlace(0)
            if core.is_float16_supported(place):
                self.check_output_with_place(place, atol=1e-3)


326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
class TestCeilModeCase1(TestCUDNNCase1):
    def init_ceil_mode(self):
        self.ceil_mode = True


class TestCeilModeCase2(TestCUDNNCase2):
    def init_ceil_mode(self):
        self.ceil_mode = True


class TestCeilModeCase3(TestCase1):
    def init_ceil_mode(self):
        self.ceil_mode = True


class TestCeilModeCase4(TestCase2):
    def init_ceil_mode(self):
        self.ceil_mode = True


346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
#--------------------test pool2d MKLDNN--------------------
class TestMKLDNNCase1(TestPool2d_Op):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


class TestMKLDNNCase2(TestCase1):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


class TestMKLDNNCase3(TestCase2):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


class TestMKLDNNCase4(TestCase3):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


class TestMKLDNNCase5(TestCase4):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


class TestMKLDNNCase6(TestCase5):
    def init_op_type(self):
        self.use_mkldnn = True
        self.op_type = "pool2d"


C
chengduoZH 已提交
383 384
if __name__ == '__main__':
    unittest.main()