|
|
@ -20,6 +20,10 @@ import paddle.fluid.initializer as I
|
|
|
|
import unittest
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _reverse_repeat_list(t, n):
|
|
|
|
|
|
|
|
return list(x for x in reversed(t) for _ in range(n))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Conv2DTestCase(unittest.TestCase):
|
|
|
|
class Conv2DTestCase(unittest.TestCase):
|
|
|
|
def __init__(self,
|
|
|
|
def __init__(self,
|
|
|
|
methodName='runTest',
|
|
|
|
methodName='runTest',
|
|
|
@ -29,12 +33,11 @@ class Conv2DTestCase(unittest.TestCase):
|
|
|
|
num_filters=8,
|
|
|
|
num_filters=8,
|
|
|
|
filter_size=3,
|
|
|
|
filter_size=3,
|
|
|
|
padding=0,
|
|
|
|
padding=0,
|
|
|
|
|
|
|
|
padding_mode='zeros',
|
|
|
|
stride=1,
|
|
|
|
stride=1,
|
|
|
|
dilation=1,
|
|
|
|
dilation=1,
|
|
|
|
groups=1,
|
|
|
|
groups=1,
|
|
|
|
act=None,
|
|
|
|
|
|
|
|
no_bias=False,
|
|
|
|
no_bias=False,
|
|
|
|
use_cudnn=True,
|
|
|
|
|
|
|
|
data_format="NCHW",
|
|
|
|
data_format="NCHW",
|
|
|
|
dtype="float32"):
|
|
|
|
dtype="float32"):
|
|
|
|
super(Conv2DTestCase, self).__init__(methodName)
|
|
|
|
super(Conv2DTestCase, self).__init__(methodName)
|
|
|
@ -45,12 +48,16 @@ class Conv2DTestCase(unittest.TestCase):
|
|
|
|
self.filter_size = filter_size
|
|
|
|
self.filter_size = filter_size
|
|
|
|
|
|
|
|
|
|
|
|
self.padding = padding
|
|
|
|
self.padding = padding
|
|
|
|
|
|
|
|
if padding_mode in {'reflect', 'replicate', 'circular'}:
|
|
|
|
|
|
|
|
_paired_padding = fluid.layers.utils.convert_to_list(padding, 2,
|
|
|
|
|
|
|
|
'padding')
|
|
|
|
|
|
|
|
self._reversed_padding_repeated_twice = _reverse_repeat_list(
|
|
|
|
|
|
|
|
_paired_padding, 2)
|
|
|
|
|
|
|
|
self.padding_mode = padding_mode
|
|
|
|
self.stride = stride
|
|
|
|
self.stride = stride
|
|
|
|
self.dilation = dilation
|
|
|
|
self.dilation = dilation
|
|
|
|
self.groups = groups
|
|
|
|
self.groups = groups
|
|
|
|
self.act = act
|
|
|
|
|
|
|
|
self.no_bias = no_bias
|
|
|
|
self.no_bias = no_bias
|
|
|
|
self.use_cudnn = use_cudnn
|
|
|
|
|
|
|
|
self.data_format = data_format
|
|
|
|
self.data_format = data_format
|
|
|
|
self.dtype = dtype
|
|
|
|
self.dtype = dtype
|
|
|
|
|
|
|
|
|
|
|
@ -91,19 +98,27 @@ class Conv2DTestCase(unittest.TestCase):
|
|
|
|
bias_attr = False
|
|
|
|
bias_attr = False
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
bias_attr = I.NumpyArrayInitializer(self.bias)
|
|
|
|
bias_attr = I.NumpyArrayInitializer(self.bias)
|
|
|
|
|
|
|
|
if self.padding_mode != 'zeros':
|
|
|
|
|
|
|
|
x_var = F.pad(x_var,
|
|
|
|
|
|
|
|
self._reversed_padding_repeated_twice,
|
|
|
|
|
|
|
|
mode=self.padding_mode,
|
|
|
|
|
|
|
|
data_format=self.data_format)
|
|
|
|
|
|
|
|
padding = 0
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
padding = self.padding
|
|
|
|
|
|
|
|
|
|
|
|
y_var = fluid.layers.conv2d(
|
|
|
|
y_var = fluid.layers.conv2d(
|
|
|
|
x_var,
|
|
|
|
x_var,
|
|
|
|
self.num_filters,
|
|
|
|
self.num_filters,
|
|
|
|
self.filter_size,
|
|
|
|
self.filter_size,
|
|
|
|
padding=self.padding,
|
|
|
|
padding=padding,
|
|
|
|
stride=self.stride,
|
|
|
|
stride=self.stride,
|
|
|
|
dilation=self.dilation,
|
|
|
|
dilation=self.dilation,
|
|
|
|
groups=self.groups,
|
|
|
|
groups=self.groups,
|
|
|
|
param_attr=weight_attr,
|
|
|
|
param_attr=weight_attr,
|
|
|
|
bias_attr=bias_attr,
|
|
|
|
bias_attr=bias_attr,
|
|
|
|
use_cudnn=self.use_cudnn,
|
|
|
|
|
|
|
|
act=self.act,
|
|
|
|
|
|
|
|
data_format=self.data_format)
|
|
|
|
data_format=self.data_format)
|
|
|
|
|
|
|
|
|
|
|
|
feed_dict = {"input": self.input}
|
|
|
|
feed_dict = {"input": self.input}
|
|
|
|
exe = fluid.Executor(place)
|
|
|
|
exe = fluid.Executor(place)
|
|
|
|
exe.run(start)
|
|
|
|
exe.run(start)
|
|
|
@ -122,16 +137,24 @@ class Conv2DTestCase(unittest.TestCase):
|
|
|
|
"weight", self.weight_shape, dtype=self.dtype)
|
|
|
|
"weight", self.weight_shape, dtype=self.dtype)
|
|
|
|
b_var = fluid.data(
|
|
|
|
b_var = fluid.data(
|
|
|
|
"bias", (self.num_filters, ), dtype=self.dtype)
|
|
|
|
"bias", (self.num_filters, ), dtype=self.dtype)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.padding_mode != 'zeros':
|
|
|
|
|
|
|
|
x_var = F.pad(x_var,
|
|
|
|
|
|
|
|
self._reversed_padding_repeated_twice,
|
|
|
|
|
|
|
|
mode=self.padding_mode,
|
|
|
|
|
|
|
|
data_format=self.data_format)
|
|
|
|
|
|
|
|
padding = 0
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
padding = self.padding
|
|
|
|
|
|
|
|
|
|
|
|
y_var = F.conv2d(
|
|
|
|
y_var = F.conv2d(
|
|
|
|
x_var,
|
|
|
|
x_var,
|
|
|
|
w_var,
|
|
|
|
w_var,
|
|
|
|
b_var if not self.no_bias else None,
|
|
|
|
b_var if not self.no_bias else None,
|
|
|
|
padding=self.padding,
|
|
|
|
padding=padding,
|
|
|
|
stride=self.stride,
|
|
|
|
stride=self.stride,
|
|
|
|
dilation=self.dilation,
|
|
|
|
dilation=self.dilation,
|
|
|
|
groups=self.groups,
|
|
|
|
groups=self.groups,
|
|
|
|
act=self.act,
|
|
|
|
|
|
|
|
use_cudnn=self.use_cudnn,
|
|
|
|
|
|
|
|
data_format=self.data_format)
|
|
|
|
data_format=self.data_format)
|
|
|
|
feed_dict = {"input": self.input, "weight": self.weight}
|
|
|
|
feed_dict = {"input": self.input, "weight": self.weight}
|
|
|
|
if self.bias is not None:
|
|
|
|
if self.bias is not None:
|
|
|
@ -143,18 +166,16 @@ class Conv2DTestCase(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
|
|
def paddle_nn_layer(self):
|
|
|
|
def paddle_nn_layer(self):
|
|
|
|
x_var = dg.to_variable(self.input)
|
|
|
|
x_var = dg.to_variable(self.input)
|
|
|
|
conv = nn.Conv2D(
|
|
|
|
conv = nn.Conv2d(
|
|
|
|
self.num_channels,
|
|
|
|
self.num_channels,
|
|
|
|
self.num_filters,
|
|
|
|
self.num_filters,
|
|
|
|
self.filter_size,
|
|
|
|
self.filter_size,
|
|
|
|
padding=self.padding,
|
|
|
|
padding=self.padding,
|
|
|
|
|
|
|
|
padding_mode=self.padding_mode,
|
|
|
|
stride=self.stride,
|
|
|
|
stride=self.stride,
|
|
|
|
dilation=self.dilation,
|
|
|
|
dilation=self.dilation,
|
|
|
|
groups=self.groups,
|
|
|
|
groups=self.groups,
|
|
|
|
act=self.act,
|
|
|
|
data_format=self.data_format)
|
|
|
|
use_cudnn=self.use_cudnn,
|
|
|
|
|
|
|
|
data_format=self.data_format,
|
|
|
|
|
|
|
|
dtype=self.dtype)
|
|
|
|
|
|
|
|
conv.weight.set_value(self.weight)
|
|
|
|
conv.weight.set_value(self.weight)
|
|
|
|
if not self.no_bias:
|
|
|
|
if not self.no_bias:
|
|
|
|
conv.bias.set_value(self.bias)
|
|
|
|
conv.bias.set_value(self.bias)
|
|
|
@ -198,7 +219,7 @@ def add_cases(suite):
|
|
|
|
methodName='runTest', stride=2, dilation=(2, 1)))
|
|
|
|
methodName='runTest', stride=2, dilation=(2, 1)))
|
|
|
|
suite.addTest(
|
|
|
|
suite.addTest(
|
|
|
|
Conv2DTestCase(
|
|
|
|
Conv2DTestCase(
|
|
|
|
methodName='runTest', padding="same", no_bias=True, act="sigmoid"))
|
|
|
|
methodName='runTest', padding="same", no_bias=True))
|
|
|
|
suite.addTest(
|
|
|
|
suite.addTest(
|
|
|
|
Conv2DTestCase(
|
|
|
|
Conv2DTestCase(
|
|
|
|
methodName='runTest', filter_size=(3, 3), padding='valid'))
|
|
|
|
methodName='runTest', filter_size=(3, 3), padding='valid'))
|
|
|
@ -222,15 +243,28 @@ def add_cases(suite):
|
|
|
|
num_filters=6,
|
|
|
|
num_filters=6,
|
|
|
|
num_channels=3,
|
|
|
|
num_channels=3,
|
|
|
|
groups=3,
|
|
|
|
groups=3,
|
|
|
|
use_cudnn=False,
|
|
|
|
|
|
|
|
act="sigmoid",
|
|
|
|
|
|
|
|
padding="valid"))
|
|
|
|
padding="valid"))
|
|
|
|
|
|
|
|
suite.addTest(
|
|
|
|
|
|
|
|
Conv2DTestCase(
|
|
|
|
|
|
|
|
methodName='runTest',
|
|
|
|
|
|
|
|
filter_size=(3, 3),
|
|
|
|
|
|
|
|
padding=1,
|
|
|
|
|
|
|
|
padding_mode='reflect'))
|
|
|
|
|
|
|
|
suite.addTest(
|
|
|
|
|
|
|
|
Conv2DTestCase(
|
|
|
|
|
|
|
|
methodName='runTest',
|
|
|
|
|
|
|
|
filter_size=(3, 3),
|
|
|
|
|
|
|
|
padding=1,
|
|
|
|
|
|
|
|
padding_mode='replicate'))
|
|
|
|
|
|
|
|
suite.addTest(
|
|
|
|
|
|
|
|
Conv2DTestCase(
|
|
|
|
|
|
|
|
methodName='runTest',
|
|
|
|
|
|
|
|
filter_size=(3, 3),
|
|
|
|
|
|
|
|
padding=1,
|
|
|
|
|
|
|
|
padding_mode='circular'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_error_cases(suite):
|
|
|
|
def add_error_cases(suite):
|
|
|
|
suite.addTest(
|
|
|
|
|
|
|
|
Conv2DErrorTestCase(
|
|
|
|
|
|
|
|
methodName='runTest', use_cudnn="not_valid"))
|
|
|
|
|
|
|
|
suite.addTest(
|
|
|
|
suite.addTest(
|
|
|
|
Conv2DErrorTestCase(
|
|
|
|
Conv2DErrorTestCase(
|
|
|
|
methodName='runTest', num_channels=5, groups=2))
|
|
|
|
methodName='runTest', num_channels=5, groups=2))
|
|
|
|