diff --git a/python/paddle/fluid/tests/unittests/test_pool1d_api.py b/python/paddle/fluid/tests/unittests/test_pool1d_api.py index 00f75337baafb78bc9a443152ec9da7cd721e2cd..9e7b0c8a1efa7f4e387266542dc3cb1c73cb12c8 100644 --- a/python/paddle/fluid/tests/unittests/test_pool1d_api.py +++ b/python/paddle/fluid/tests/unittests/test_pool1d_api.py @@ -340,6 +340,36 @@ class TestPool2DError_API(unittest.TestCase): self.assertRaises(ValueError, run7) + def run_kernel_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform(-1, 1, + [2, 3, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + padding = 0 + res_pd = F.avg_pool1d( + input_pd, + kernel_size=-1, + stride=2, + padding=padding, + ceil_mode=True) + + self.assertRaises(ValueError, run_kernel_out_of_range) + + def run_stride_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform(-1, 1, + [2, 3, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + padding = 0 + res_pd = F.avg_pool1d( + input_pd, + kernel_size=2, + stride=0, + padding=padding, + ceil_mode=True) + + self.assertRaises(ValueError, run_stride_out_of_range) + if __name__ == '__main__': unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_pool2d_api.py b/python/paddle/fluid/tests/unittests/test_pool2d_api.py index f4432bf33864707045513f2122f02bdd9a6394b7..872bec666bf8c3190dd976bbf63aac5e1713da1c 100644 --- a/python/paddle/fluid/tests/unittests/test_pool2d_api.py +++ b/python/paddle/fluid/tests/unittests/test_pool2d_api.py @@ -494,6 +494,36 @@ class TestPool2DError_API(unittest.TestCase): self.assertRaises(ValueError, run9) + def run_kernel_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform(-1, 1, + [2, 3, 32, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + res_pd = avg_pool2d( + input_pd, + kernel_size=[-1, 2], + stride=2, + padding=0, + ceil_mode=False, + data_format='NHWC') + + self.assertRaises(ValueError, run_kernel_out_of_range) + + def run_stride_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform(-1, 1, + [2, 3, 32, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + res_pd = avg_pool2d( + input_pd, + kernel_size=3, + stride=[0, 2], + padding=0, + ceil_mode=False, + data_format='NHWC') + + self.assertRaises(ValueError, run_stride_out_of_range) + if __name__ == '__main__': unittest.main() diff --git a/python/paddle/fluid/tests/unittests/test_pool3d_api.py b/python/paddle/fluid/tests/unittests/test_pool3d_api.py index 91158fe674b1e8686adaf50c05fc30bf1578833e..cddb09e5daa41b40c00ee565bc900d24d5e85256 100644 --- a/python/paddle/fluid/tests/unittests/test_pool3d_api.py +++ b/python/paddle/fluid/tests/unittests/test_pool3d_api.py @@ -471,6 +471,34 @@ class TestPool3DError_API(unittest.TestCase): self.assertRaises(ValueError, run10) + def run_kernel_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform( + -1, 1, [2, 3, 32, 32, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + res_pd = avg_pool3d( + input_pd, + kernel_size=-1, + stride=2, + padding="VALID", + ceil_mode=True) + + self.assertRaises(ValueError, run_kernel_out_of_range) + + def run_size_out_of_range(): + with fluid.dygraph.guard(): + input_np = np.random.uniform( + -1, 1, [2, 3, 32, 32, 32]).astype(np.float32) + input_pd = fluid.dygraph.to_variable(input_np) + res_pd = avg_pool3d( + input_pd, + kernel_size=2, + stride=0, + padding="VALID", + ceil_mode=True) + + self.assertRaises(ValueError, run_size_out_of_range) + if __name__ == '__main__': unittest.main() diff --git a/python/paddle/nn/functional/pooling.py b/python/paddle/nn/functional/pooling.py index ba69c63903770f0c590c434bdedb2197277c337a..4a96f884ca5e30305c4bf0bbeccb1373fa5d353b 100755 --- a/python/paddle/nn/functional/pooling.py +++ b/python/paddle/nn/functional/pooling.py @@ -42,6 +42,17 @@ def _check_instance(x, x_name, types=(int, float)): format(types, x_name, type(x))) +def _check_value_limitation(x, x_name, min_limit=1e-3): + def _check_value(x, x_name, min_limit=1e-3): + if isinstance(x, int) and min_limit is not None and x < min_limit: + raise ValueError( + "Excepted the input {} to be greater than {} but received x: {}. ". + format(x_name, min_limit, x)) + + for ele in x: + _check_value(ele, x_name) + + def _zero_padding_in_batch_and_channel(padding, channel_last): if channel_last: return list(padding[0]) == [0, 0] and list(padding[-1]) == [0, 0] @@ -211,6 +222,9 @@ def avg_pool1d(x, stride = utils.convert_to_list(stride, 1, 'pool_stride') stride = [1] + stride + _check_value_limitation(kernel_size, "kernel_size", min_limit=1e-3) + _check_value_limitation(stride, "stride", min_limit=1e-3) + channel_last = _channel_last("NCL", 1) padding, padding_algorithm = _update_padding_nd( padding, 1, channel_last=channel_last, ceil_mode=ceil_mode) @@ -325,6 +339,9 @@ def avg_pool2d(x, else: stride = utils.convert_to_list(stride, 2, 'pool_stride') + _check_value_limitation(kernel_size, "kernel_size", min_limit=1e-3) + _check_value_limitation(stride, "stride", min_limit=1e-3) + channel_last = _channel_last(data_format, 2) padding, padding_algorithm = _update_padding_nd( padding, 2, channel_last, ceil_mode=ceil_mode) @@ -448,6 +465,9 @@ def avg_pool3d(x, padding, padding_algorithm = _update_padding_nd( padding, 3, channel_last=channel_last, ceil_mode=ceil_mode) + _check_value_limitation(kernel_size, "kernel_size", min_limit=1e-3) + _check_value_limitation(stride, "stride", min_limit=1e-3) + if in_dygraph_mode(): output = _C_ops.pool3d( x, 'pooling_type', 'avg', 'ksize', kernel_size, 'strides', stride,