test_pool3d_op.py 5.9 KB
Newer Older
C
chengduoZH 已提交
1 2 3 4 5
import unittest
import numpy as np
from op_test import OpTest


C
chengduoZH 已提交
6
def max_pool3D_forward_naive(x, ksize, strides, paddings, global_pool=0):
C
chengduoZH 已提交
7
    N, C, D, H, W = x.shape
C
chengduoZH 已提交
8 9
    if global_pool == 1:
        ksize = [D, H, W]
C
chengduoZH 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
    D_out = (D - ksize[0] + 2 * paddings[0]) / strides[0] + 1
    H_out = (H - ksize[1] + 2 * paddings[1]) / strides[1] + 1
    W_out = (W - ksize[2] + 2 * paddings[2]) / strides[2] + 1
    out = np.zeros((N, C, D_out, H_out, W_out))
    for k in xrange(D_out):
        d_start = np.max((k * strides[0] - paddings[0], 0))
        d_end = np.min((k * strides[0] + ksize[0] - paddings[0], D))
        for i in xrange(H_out):
            h_start = np.max((i * strides[0] - paddings[0], 0))
            h_end = np.min((i * strides[0] + ksize[0] - paddings[0], H))
            for j in xrange(W_out):
                w_start = np.max((j * strides[1] - paddings[1], 0))
                w_end = np.min((j * strides[1] + ksize[1] - paddings[1], W))
                x_masked = x[:, :, d_start:d_end, h_start:h_end, w_start:w_end]

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


C
chengduoZH 已提交
29
def avg_pool3D_forward_naive(x, ksize, strides, paddings, global_pool=0):
C
chengduoZH 已提交
30
    N, C, D, H, W = x.shape
C
chengduoZH 已提交
31 32
    if global_pool == 1:
        ksize = [D, H, W]
C
chengduoZH 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
    D_out = (D - ksize[0] + 2 * paddings[0]) / strides[0] + 1
    H_out = (H - ksize[1] + 2 * paddings[1]) / strides[1] + 1
    W_out = (W - ksize[2] + 2 * paddings[2]) / strides[2] + 1
    out = np.zeros((N, C, D_out, H_out, W_out))
    for k in xrange(D_out):
        d_start = np.max((k * strides[0] - paddings[0], 0))
        d_end = np.min((k * strides[0] + ksize[0] - paddings[0], D))
        for i in xrange(H_out):
            h_start = np.max((i * strides[0] - paddings[0], 0))
            h_end = np.min((i * strides[0] + ksize[0] - paddings[0], H))
            for j in xrange(W_out):
                w_start = np.max((j * strides[1] - paddings[1], 0))
                w_end = np.min((j * strides[1] + ksize[1] - paddings[1], W))
                x_masked = x[:, :, d_start:d_end, h_start:h_end, w_start:w_end]

                out[:, :, k, i, j] = np.sum(x_masked, axis=(2, 3, 4)) / (
                    (d_end - d_start) * (h_end - h_start) * (w_end - w_start))
    return out


class TestPool3d_Op(OpTest):
    def setUp(self):
C
fix bug  
chengduoZH 已提交
55
        self.init_test_case()
C
chengduoZH 已提交
56 57 58 59
        self.init_global_pool()
        self.init_op_type()
        self.init_pool_type()

C
fix bug  
chengduoZH 已提交
60 61
        if self.global_pool:
            self.paddings = [0 for _ in range(len(self.paddings))]
C
chengduoZH 已提交
62 63
        input = np.random.random(self.shape).astype("float32")
        output = self.pool3D_forward_naive(input, self.ksize, self.strides,
C
fix bug  
chengduoZH 已提交
64 65
                                           self.paddings,
                                           self.global_pool).astype("float32")
66
        self.inputs = {'X': input}
C
chengduoZH 已提交
67 68 69 70 71

        self.attrs = {
            'strides': self.strides,
            'paddings': self.paddings,
            'ksize': self.ksize,
C
chengduoZH 已提交
72 73
            'pooling_type': self.pool_type,
            'global_pooling': self.global_pool,
C
chengduoZH 已提交
74 75
        }

Y
Yu Yang 已提交
76
        self.outputs = {'Out': output.astype('float32')}
C
chengduoZH 已提交
77 78 79 80 81

    def test_check_output(self):
        self.check_output()

    def test_check_grad(self):
C
chengduoZH 已提交
82
        if self.pool_type != "max":
83
            self.check_grad(set(['X']), 'Out', max_relative_error=0.07)
C
chengduoZH 已提交
84

C
fix bug  
chengduoZH 已提交
85
    def init_test_case(self):
C
chengduoZH 已提交
86 87 88 89 90
        self.shape = [2, 3, 5, 5, 5]
        self.ksize = [3, 3, 3]
        self.strides = [1, 1, 1]
        self.paddings = [0, 0, 0]

C
chengduoZH 已提交
91 92 93 94 95 96 97 98 99 100
    def init_op_type(self):
        self.op_type = "pool3d"

    def init_pool_type(self):
        self.pool_type = "avg"
        self.pool3D_forward_naive = avg_pool3D_forward_naive

    def init_global_pool(self):
        self.global_pool = True

C
chengduoZH 已提交
101 102

class TestCase1(TestPool3d_Op):
C
fix bug  
chengduoZH 已提交
103
    def init_test_case(self):
C
chengduoZH 已提交
104 105 106 107
        self.op_type = "pool3d"
        self.shape = [2, 3, 7, 7, 7]
        self.ksize = [3, 3, 3]
        self.strides = [1, 1, 1]
C
chengduoZH 已提交
108
        self.paddings = [0, 0, 0]
C
chengduoZH 已提交
109

C
chengduoZH 已提交
110
    def init_op_type(self):
C
chengduoZH 已提交
111
        self.op_type = "pool3d"
C
chengduoZH 已提交
112 113

    def init_pool_type(self):
C
chengduoZH 已提交
114 115
        self.pool_type = "avg"
        self.pool3D_forward_naive = avg_pool3D_forward_naive
C
chengduoZH 已提交
116 117 118 119 120 121 122

    def init_global_pool(self):
        self.global_pool = False


class TestCase2(TestPool3d_Op):
    def init_test_case(self):
C
chengduoZH 已提交
123 124 125 126 127
        self.shape = [2, 3, 7, 7, 7]
        self.ksize = [3, 3, 3]
        self.strides = [1, 1, 1]
        self.paddings = [1, 1, 1]

C
chengduoZH 已提交
128 129 130 131 132 133 134 135 136 137
    def init_op_type(self):
        self.op_type = "pool3d"

    def init_pool_type(self):
        self.pool_type = "avg"
        self.pool3D_forward_naive = avg_pool3D_forward_naive

    def init_global_pool(self):
        self.global_pool = False

C
chengduoZH 已提交
138 139

class TestCase3(TestPool3d_Op):
C
chengduoZH 已提交
140
    def init_op_type(self):
C
chengduoZH 已提交
141
        self.op_type = "pool3d"
C
chengduoZH 已提交
142 143

    def init_pool_type(self):
C
chengduoZH 已提交
144 145 146 147
        self.pool_type = "max"
        self.pool3D_forward_naive = max_pool3D_forward_naive


C
chengduoZH 已提交
148 149
class TestCase4(TestCase1):
    def init_op_type(self):
C
chengduoZH 已提交
150
        self.op_type = "pool3d"
C
chengduoZH 已提交
151 152

    def init_pool_type(self):
C
chengduoZH 已提交
153 154
        self.pool_type = "max"
        self.pool3D_forward_naive = max_pool3D_forward_naive
C
chengduoZH 已提交
155 156


C
chengduoZH 已提交
157 158
class TestCase5(TestCase2):
    def init_op_type(self):
C
chengduoZH 已提交
159
        self.op_type = "pool3d"
C
chengduoZH 已提交
160 161

    def init_pool_type(self):
C
chengduoZH 已提交
162 163
        self.pool_type = "max"
        self.pool3D_forward_naive = max_pool3D_forward_naive
C
chengduoZH 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194


#--------------------test pool3d_cudnn--------------------
class TestCudnnCase1(TestPool3d_Op):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"


class TestCudnnCase2(TestCase1):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"


class TestCudnnCase3(TestCase2):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"


class TestCudnnCase4(TestCase3):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"


class TestCudnnCase5(TestCase4):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"


class TestCudnnCase6(TestCase5):
    def init_op_type(self):
        self.op_type = "pool3d_cudnn"
C
chengduoZH 已提交
195

C
chengduoZH 已提交
196 197 198

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