|
|
|
@ -24,12 +24,12 @@ def conv2d_forward_naive(input, filter, group, conv_param):
|
|
|
|
|
out_c, f_c, f_h, f_w = filter.shape
|
|
|
|
|
assert f_c * group == in_c
|
|
|
|
|
assert np.mod(out_c, group) == 0
|
|
|
|
|
sub_out_c = out_c / group
|
|
|
|
|
sub_out_c = out_c // group
|
|
|
|
|
|
|
|
|
|
stride, pad, dilation = conv_param['stride'], conv_param['pad'], conv_param[
|
|
|
|
|
'dilation']
|
|
|
|
|
out_h = 1 + (in_h + 2 * pad[0] - (dilation[0] * (f_h - 1) + 1)) / stride[0]
|
|
|
|
|
out_w = 1 + (in_w + 2 * pad[1] - (dilation[1] * (f_w - 1) + 1)) / stride[1]
|
|
|
|
|
out_h = 1 + (in_h + 2 * pad[0] - (dilation[0] * (f_h - 1) + 1)) // stride[0]
|
|
|
|
|
out_w = 1 + (in_w + 2 * pad[1] - (dilation[1] * (f_w - 1) + 1)) // stride[1]
|
|
|
|
|
out = np.zeros((in_n, out_c, out_h, out_w))
|
|
|
|
|
|
|
|
|
|
d_bolck_h = (dilation[0] * (f_h - 1) + 1)
|
|
|
|
@ -160,7 +160,7 @@ class TestConv2dOp(OpTest):
|
|
|
|
|
self.stride = [1, 1]
|
|
|
|
|
self.input_size = [2, 3, 5, 5] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
|
|
|
|
|
def init_dilation(self):
|
|
|
|
@ -179,7 +179,7 @@ class TestWithPad(TestConv2dOp):
|
|
|
|
|
self.stride = [1, 1]
|
|
|
|
|
self.input_size = [2, 3, 5, 5] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -189,7 +189,7 @@ class TestWithStride(TestConv2dOp):
|
|
|
|
|
self.stride = [2, 2]
|
|
|
|
|
self.input_size = [2, 3, 6, 6] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -204,7 +204,7 @@ class TestWith1x1(TestConv2dOp):
|
|
|
|
|
self.stride = [1, 1]
|
|
|
|
|
self.input_size = [2, 3, 5, 5] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 1, 1]
|
|
|
|
|
|
|
|
|
|
def init_group(self):
|
|
|
|
@ -217,7 +217,7 @@ class TestWithDilation(TestConv2dOp):
|
|
|
|
|
self.stride = [1, 1]
|
|
|
|
|
self.input_size = [2, 3, 10, 10] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
|
|
|
|
|
def init_dilation(self):
|
|
|
|
@ -233,7 +233,7 @@ class TestWithInput1x1Filter1x1(TestConv2dOp):
|
|
|
|
|
self.stride = [1, 1]
|
|
|
|
|
self.input_size = [2, 3, 1, 1] # NCHW
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 1, 1]
|
|
|
|
|
|
|
|
|
|
def init_group(self):
|
|
|
|
@ -350,7 +350,7 @@ class TestDepthwiseConv(TestConv2dOp):
|
|
|
|
|
self.input_size = [2, 3, 5, 5] # NCHW
|
|
|
|
|
self.groups = 3
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
self.op_type = "depthwise_conv2d"
|
|
|
|
|
|
|
|
|
@ -362,7 +362,7 @@ class TestDepthwiseConv2(TestConv2dOp):
|
|
|
|
|
self.input_size = [2, 3, 5, 5] # NCHW
|
|
|
|
|
self.groups = 3
|
|
|
|
|
assert np.mod(self.input_size[1], self.groups) == 0
|
|
|
|
|
f_c = self.input_size[1] / self.groups
|
|
|
|
|
f_c = self.input_size[1] // self.groups
|
|
|
|
|
self.filter_size = [6, f_c, 3, 3]
|
|
|
|
|
self.op_type = "depthwise_conv2d"
|
|
|
|
|
|
|
|
|
|