From 290c208fa8136e15beae0e9d49a9002dc12946b5 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Wed, 29 Jan 2020 01:56:32 +0000 Subject: [PATCH 01/10] enforce 4-way padding --- python/tvm/relay/op/nn/nn.py | 5 ++++- .../python/unittest/test_graph_tuner_core.py | 22 +++++++++---------- topi/python/topi/nn/conv2d.py | 2 ++ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index 2473aab63314..3fa11df75e49 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -201,7 +201,10 @@ def conv2d(data, if isinstance(dilation, int): dilation = (dilation, dilation) if isinstance(padding, int): - padding = (padding, padding) + padding = (padding, padding, padding, padding) + # convert 2-way padding to 4-way padding + if len(padding) == 2: + padding = (padding[0], padding[1], padding[0], padding[1]) return _make.conv2d(data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, diff --git a/tests/python/unittest/test_graph_tuner_core.py b/tests/python/unittest/test_graph_tuner_core.py index 1d8e2efda5b2..32c16e239461 100644 --- a/tests/python/unittest/test_graph_tuner_core.py +++ b/tests/python/unittest/test_graph_tuner_core.py @@ -50,9 +50,9 @@ def _create_data(target, dshape, dtype, layout): params=params, ops=(relay.op.nn.conv2d,)) wkl_list = [ - create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 32, 8, 8), (32, 32, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0, 0, 0), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 32, 8, 8), (32, 32, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), ] costs = [0.04, 0.012, 0.03] config_list = [] @@ -279,9 +279,9 @@ def test_many_sub_graphs(): params=params, ops=(relay.op.nn.conv2d,)) wkl_list = [ - create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 32, 8, 8), (32, 32, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0, 0, 0), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 32, 8, 8), (32, 32, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), ] costs = [0.04, 0.012, 0.03, 0.02, 0.02, 0.045] config_list = [] @@ -392,8 +392,8 @@ def test_tuple(): params=params, ops=(relay.op.nn.conv2d,)) wkl_list = [ - create_workload((1, 5, 32, 32), (2, 5, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 5, 32, 32), (3, 5, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 5, 32, 32), (2, 5, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 5, 32, 32), (3, 5, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), ] costs = [0.01, 0.012, 0.03, 0.04] config_list = [] @@ -490,9 +490,9 @@ def test_triangle_block(): params=params, ops=(relay.op.nn.conv2d,)) wkl_list = [ - create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0), (1, 1), layout, layout, dtype, dtype), - create_workload((1, 3, 8, 8), (32, 3, 3, 3), (1, 1), (1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 3, 8, 8), (16, 3, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 16, 8, 8), (32, 16, 1, 1), (1, 1), (0, 0, 0, 0), (1, 1), layout, layout, dtype, dtype), + create_workload((1, 3, 8, 8), (32, 3, 3, 3), (1, 1), (1, 1, 1, 1), (1, 1), layout, layout, dtype, dtype), ] costs = [0.04, 0.012, 0.03, 0.02, 0.02, 0.045] config_list = [] diff --git a/topi/python/topi/nn/conv2d.py b/topi/python/topi/nn/conv2d.py index 664a293d56ae..dde1f5802c84 100644 --- a/topi/python/topi/nn/conv2d.py +++ b/topi/python/topi/nn/conv2d.py @@ -62,6 +62,8 @@ def conv2d(input, filter, strides, padding, dilation, layout='NCHW', out_dtype=N output : tvm.Tensor 4-D with shape [batch, out_channel, out_height, out_width] """ + #only accepts 4-way padding + assert len(padding)==4, "only accepts 4-way padding" # search platform specific declaration first # default declaration if layout == 'NCHW': From ff55f62cae0d6ec3930978224393a5e79aee95b8 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Wed, 29 Jan 2020 03:04:03 +0000 Subject: [PATCH 02/10] add util with get_pad_tuple --- python/tvm/relay/op/nn/nn.py | 8 +++-- python/tvm/relay/op/nn/util.py | 61 ++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 python/tvm/relay/op/nn/util.py diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index 3fa11df75e49..adacde4f314a 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -19,6 +19,7 @@ from __future__ import absolute_import as _abs from ...expr import TupleWrapper from . import _make +from .util import get_pad_tuple def conv1d(data, @@ -201,10 +202,11 @@ def conv2d(data, if isinstance(dilation, int): dilation = (dilation, dilation) if isinstance(padding, int): - padding = (padding, padding, padding, padding) + padding = (padding, padding) # convert 2-way padding to 4-way padding - if len(padding) == 2: - padding = (padding[0], padding[1], padding[0], padding[1]) + dilated_kernel_h = (kernel_size[0] - 1) * dilation[0] + 1 + dilated_kernel_w = (kernel_size[1] - 1) * dilation[1] + 1 + padding = get_pad_tuple(padding, (dilated_kernel_h, dilated_kernel_w)) return _make.conv2d(data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, diff --git a/python/tvm/relay/op/nn/util.py b/python/tvm/relay/op/nn/util.py new file mode 100644 index 000000000000..33208c928346 --- /dev/null +++ b/python/tvm/relay/op/nn/util.py @@ -0,0 +1,61 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# 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. +# pylint: disable=invalid-name, unused-variable +"""NN operator common utilities""" +from __future__ import absolute_import + +def get_pad_tuple(padding, kernel): + """Common code to get the pad option + Parameters + ---------- + padding : int or str + Padding size, or ['VALID', 'SAME'] + kernel : tuple of int + Conv kernel size + Returns + ------- + pad_top : int + Padding size on top + pad_left : int + Padding size on left + pad_down : int + Padding size on down. + pad_right : int + Padding size on right. + """ + # compute the padding size + if isinstance(padding, (tuple, list)): + if len(padding) == 2: + pad_h = padding[0] * 2 + pad_w = padding[1] * 2 + elif len(padding) == 4: + return padding[0], padding[1], padding[2], padding[3] + else: + raise ValueError("Size of padding can only be 2 or 4") + elif isinstance(padding, int): + pad_h = pad_w = padding * 2 + elif padding == "VALID": + pad_h = 0 + pad_w = 0 + elif padding == "SAME": + pad_h = kernel[0] - 1 + pad_w = kernel[1] - 1 + else: + raise ValueError("Unknown padding option %s" % padding) + pad_top = (pad_h + 1) // 2 + pad_left = (pad_w + 1) // 2 + return pad_top, pad_left, pad_h - pad_top, pad_w - pad_left From 1faaad3444abb7f3bd3059c919f02e2e65920e99 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Wed, 29 Jan 2020 07:51:08 +0000 Subject: [PATCH 03/10] delete unnecessary arguments --- python/tvm/relay/op/nn/nn.py | 4 +--- python/tvm/relay/op/nn/util.py | 10 +--------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index adacde4f314a..fcc52286297f 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -204,9 +204,7 @@ def conv2d(data, if isinstance(padding, int): padding = (padding, padding) # convert 2-way padding to 4-way padding - dilated_kernel_h = (kernel_size[0] - 1) * dilation[0] + 1 - dilated_kernel_w = (kernel_size[1] - 1) * dilation[1] + 1 - padding = get_pad_tuple(padding, (dilated_kernel_h, dilated_kernel_w)) + padding = get_pad_tuple(padding) return _make.conv2d(data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, diff --git a/python/tvm/relay/op/nn/util.py b/python/tvm/relay/op/nn/util.py index 33208c928346..4fcd0f208372 100644 --- a/python/tvm/relay/op/nn/util.py +++ b/python/tvm/relay/op/nn/util.py @@ -18,14 +18,12 @@ """NN operator common utilities""" from __future__ import absolute_import -def get_pad_tuple(padding, kernel): +def get_pad_tuple(padding): """Common code to get the pad option Parameters ---------- padding : int or str Padding size, or ['VALID', 'SAME'] - kernel : tuple of int - Conv kernel size Returns ------- pad_top : int @@ -48,12 +46,6 @@ def get_pad_tuple(padding, kernel): raise ValueError("Size of padding can only be 2 or 4") elif isinstance(padding, int): pad_h = pad_w = padding * 2 - elif padding == "VALID": - pad_h = 0 - pad_w = 0 - elif padding == "SAME": - pad_h = kernel[0] - 1 - pad_w = kernel[1] - 1 else: raise ValueError("Unknown padding option %s" % padding) pad_top = (pad_h + 1) // 2 From 87c35db88f8b211f7534749aeb77ebfa549589c4 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Wed, 29 Jan 2020 08:33:56 +0000 Subject: [PATCH 04/10] fix lint --- topi/python/topi/nn/conv2d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/topi/python/topi/nn/conv2d.py b/topi/python/topi/nn/conv2d.py index dde1f5802c84..b8ddf9ec0ff9 100644 --- a/topi/python/topi/nn/conv2d.py +++ b/topi/python/topi/nn/conv2d.py @@ -63,7 +63,7 @@ def conv2d(input, filter, strides, padding, dilation, layout='NCHW', out_dtype=N 4-D with shape [batch, out_channel, out_height, out_width] """ #only accepts 4-way padding - assert len(padding)==4, "only accepts 4-way padding" + assert len(padding) == 4, "only accepts 4-way padding" # search platform specific declaration first # default declaration if layout == 'NCHW': From eaee475848a6d6cb3f02bb31c06c35e34472077c Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Thu, 30 Jan 2020 01:21:20 +0000 Subject: [PATCH 05/10] add container.Array case --- python/tvm/relay/op/nn/nn.py | 2 -- python/tvm/relay/op/nn/util.py | 7 +++++-- tests/python/relay/test_pass_alter_op_layout.py | 2 +- topi/python/topi/nn/conv2d.py | 3 +-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index fcc52286297f..d3fde2041a70 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -201,8 +201,6 @@ def conv2d(data, strides = (strides, strides) if isinstance(dilation, int): dilation = (dilation, dilation) - if isinstance(padding, int): - padding = (padding, padding) # convert 2-way padding to 4-way padding padding = get_pad_tuple(padding) diff --git a/python/tvm/relay/op/nn/util.py b/python/tvm/relay/op/nn/util.py index 4fcd0f208372..b1af14d92863 100644 --- a/python/tvm/relay/op/nn/util.py +++ b/python/tvm/relay/op/nn/util.py @@ -17,13 +17,14 @@ # pylint: disable=invalid-name, unused-variable """NN operator common utilities""" from __future__ import absolute_import +from .... import container def get_pad_tuple(padding): """Common code to get the pad option Parameters ---------- - padding : int or str - Padding size, or ['VALID', 'SAME'] + padding : Union[int, Tuple[int, ...]] + Padding size Returns ------- pad_top : int @@ -36,6 +37,8 @@ def get_pad_tuple(padding): Padding size on right. """ # compute the padding size + if isinstance(padding, container.Array): + padding = list(padding) if isinstance(padding, (tuple, list)): if len(padding) == 2: pad_h = padding[0] * 2 diff --git a/tests/python/relay/test_pass_alter_op_layout.py b/tests/python/relay/test_pass_alter_op_layout.py index 3f02e1db625e..b01e1bbe0504 100644 --- a/tests/python/relay/test_pass_alter_op_layout.py +++ b/tests/python/relay/test_pass_alter_op_layout.py @@ -617,7 +617,7 @@ def expected(): w = relay.var("w", shape=(32, 1, 3, 3)) x = relay.layout_transform(x, "NCHW", "NCHW8c") w = relay.layout_transform(w, "OIHW", "OIHW1i8o") - y = relay.nn.contrib_depthwise_conv2d_nchwc(x, w, padding=(1, 1), channels=32, kernel_size=(3, 3), + y = relay.nn.contrib_depthwise_conv2d_nchwc(x, w, padding=(1, 1, 1, 1), channels=32, kernel_size=(3, 3), groups=32, data_layout="NCHW8c", kernel_layout="OIHW1i8o", out_layout="NCHW8c") y = relay.layout_transform(y, "NCHW8c", "NCHW") diff --git a/topi/python/topi/nn/conv2d.py b/topi/python/topi/nn/conv2d.py index b8ddf9ec0ff9..4b802cb13689 100644 --- a/topi/python/topi/nn/conv2d.py +++ b/topi/python/topi/nn/conv2d.py @@ -46,9 +46,8 @@ def conv2d(input, filter, strides, padding, dilation, layout='NCHW', out_dtype=N strides : int or a list/tuple of two ints stride size, or [stride_height, stride_width] - padding : int or a list/tuple of 2 or 4 ints + padding : int or a list/tuple of 4 ints padding size, or - [pad_height, pad_width] for 2 ints, or [pad_top, pad_left, pad_bottom, pad_right] for 4 ints dilation: int or a list/tuple of two ints From 48878860b19f9129202fdbcc40ba3a52ee8df480 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Thu, 30 Jan 2020 03:27:48 +0000 Subject: [PATCH 06/10] fix cudnn conv2d asymmetric padding logic --- topi/python/topi/cuda/conv2d.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/topi/python/topi/cuda/conv2d.py b/topi/python/topi/cuda/conv2d.py index 12ab77b03b31..d831ba494d9f 100644 --- a/topi/python/topi/cuda/conv2d.py +++ b/topi/python/topi/cuda/conv2d.py @@ -86,7 +86,8 @@ def conv2d_cuda(cfg, data, kernel, strides, padding, dilation, layout='NCHW', ou stride_h, stride_w = (strides, strides) if isinstance(strides, int) else strides dilation_h, dilation_w = (dilation, dilation) if isinstance(dilation, int) else dilation - if isinstance(padding, (list, tuple)) and len(padding) > 2: + if isinstance(padding, (list, tuple)) and len(padding) == 4 and \ + (padding[0] != padding[2] or padding[1] != padding[3]): raise ValueError("Cudnn doesn't support asymmetric padding.") pt, pl, pb, pr = get_pad_tuple(padding, (KH, KW)) OH = (H + pt + pb - KH) // stride_h + 1 From 427d796b75bcce4018972ba363d3e7ffbb900c6b Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Fri, 31 Jan 2020 00:28:29 +0000 Subject: [PATCH 07/10] rename get_pad_tuple to get_pad_tuple2d --- python/tvm/relay/op/nn/nn.py | 5 +++-- python/tvm/relay/op/nn/util.py | 2 +- topi/python/topi/nn/conv2d.py | 2 -- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index d3fde2041a70..14eb9657f09b 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -19,7 +19,7 @@ from __future__ import absolute_import as _abs from ...expr import TupleWrapper from . import _make -from .util import get_pad_tuple +from .util import get_pad_tuple2d def conv1d(data, @@ -201,8 +201,9 @@ def conv2d(data, strides = (strides, strides) if isinstance(dilation, int): dilation = (dilation, dilation) + # TODO enforce 4-way padding in topi/nn/conv2d after #4644 merged # convert 2-way padding to 4-way padding - padding = get_pad_tuple(padding) + padding = get_pad_tuple2d(padding) return _make.conv2d(data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, diff --git a/python/tvm/relay/op/nn/util.py b/python/tvm/relay/op/nn/util.py index b1af14d92863..d908e6749f62 100644 --- a/python/tvm/relay/op/nn/util.py +++ b/python/tvm/relay/op/nn/util.py @@ -19,7 +19,7 @@ from __future__ import absolute_import from .... import container -def get_pad_tuple(padding): +def get_pad_tuple2d(padding): """Common code to get the pad option Parameters ---------- diff --git a/topi/python/topi/nn/conv2d.py b/topi/python/topi/nn/conv2d.py index 4b802cb13689..c08c46c23ed8 100644 --- a/topi/python/topi/nn/conv2d.py +++ b/topi/python/topi/nn/conv2d.py @@ -61,8 +61,6 @@ def conv2d(input, filter, strides, padding, dilation, layout='NCHW', out_dtype=N output : tvm.Tensor 4-D with shape [batch, out_channel, out_height, out_width] """ - #only accepts 4-way padding - assert len(padding) == 4, "only accepts 4-way padding" # search platform specific declaration first # default declaration if layout == 'NCHW': From efd2013700723aa1824798281b5ac94fd5975918 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Fri, 31 Jan 2020 00:38:07 +0000 Subject: [PATCH 08/10] revert change for topi/python/topi/nn/conv2d.py --- topi/python/topi/nn/conv2d.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/topi/python/topi/nn/conv2d.py b/topi/python/topi/nn/conv2d.py index c08c46c23ed8..664a293d56ae 100644 --- a/topi/python/topi/nn/conv2d.py +++ b/topi/python/topi/nn/conv2d.py @@ -46,8 +46,9 @@ def conv2d(input, filter, strides, padding, dilation, layout='NCHW', out_dtype=N strides : int or a list/tuple of two ints stride size, or [stride_height, stride_width] - padding : int or a list/tuple of 4 ints + padding : int or a list/tuple of 2 or 4 ints padding size, or + [pad_height, pad_width] for 2 ints, or [pad_top, pad_left, pad_bottom, pad_right] for 4 ints dilation: int or a list/tuple of two ints From 62b00d4d04c6a2c32485952f2d93616dc78349dd Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Sat, 1 Feb 2020 14:43:15 +0000 Subject: [PATCH 09/10] add get_pad_tuple2d for several contrib conv2d ops --- python/tvm/relay/op/nn/nn.py | 8 ++++++++ python/tvm/relay/op/nn/util.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index 14eb9657f09b..7c1632aa09fe 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -1760,6 +1760,8 @@ def contrib_conv2d_winograd_without_weight_transform(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.contrib_conv2d_winograd_without_weight_transform( data, weight, tile_size, strides, padding, dilation, groups, channels, kernel_size, data_layout, @@ -1826,6 +1828,8 @@ def contrib_conv2d_winograd_nnpack_without_weight_transform(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.contrib_conv2d_winograd_nnpack_without_weight_transform( data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, @@ -1893,6 +1897,8 @@ def contrib_conv2d_nchwc(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.contrib_conv2d_NCHWc(data, kernel, strides, padding, dilation, groups, channels, kernel_size, data_layout, kernel_layout, out_layout, out_dtype) @@ -2023,6 +2029,8 @@ def contrib_conv2d_nchwc_int8(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.contrib_conv2d_NCHWc_int8(data, kernel, strides, padding, dilation, groups, channels, kernel_size, data_layout, kernel_layout, out_layout, out_dtype) diff --git a/python/tvm/relay/op/nn/util.py b/python/tvm/relay/op/nn/util.py index d908e6749f62..ba536ad39936 100644 --- a/python/tvm/relay/op/nn/util.py +++ b/python/tvm/relay/op/nn/util.py @@ -44,7 +44,7 @@ def get_pad_tuple2d(padding): pad_h = padding[0] * 2 pad_w = padding[1] * 2 elif len(padding) == 4: - return padding[0], padding[1], padding[2], padding[3] + return padding[0], padding[1], padding[2], padding[3] else: raise ValueError("Size of padding can only be 2 or 4") elif isinstance(padding, int): From 00fd0c45ac6a6c880c1f2c21eb79ca86b4778ba2 Mon Sep 17 00:00:00 2001 From: Xingyu Zhou Date: Tue, 4 Feb 2020 23:39:06 +0000 Subject: [PATCH 10/10] add get_pad_tuple2d for all conv2d ops --- python/tvm/relay/op/nn/nn.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/python/tvm/relay/op/nn/nn.py b/python/tvm/relay/op/nn/nn.py index 7c1632aa09fe..c76d5ed37135 100644 --- a/python/tvm/relay/op/nn/nn.py +++ b/python/tvm/relay/op/nn/nn.py @@ -365,6 +365,8 @@ def conv2d_transpose(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.conv2d_transpose(data, weight, strides, padding, dilation, groups, channels, kernel_size, data_layout, kernel_layout, out_layout, output_padding, out_dtype) @@ -1964,6 +1966,8 @@ def contrib_depthwise_conv2d_nchwc(data, result : tvm.relay.Expr The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.contrib_depthwise_conv2d_NCHWc(data, kernel, strides, padding, dilation, groups, channels, kernel_size, data_layout, kernel_layout, out_layout, out_dtype) @@ -2152,6 +2156,8 @@ def deformable_conv2d(data, The computed result. """ + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.deformable_conv2d(data, offset, weight, strides, padding, dilation, deformable_groups, groups, channels, kernel_size, data_layout, kernel_layout, out_layout, out_dtype) @@ -2261,7 +2267,8 @@ def bitserial_conv2d(data, result : tvm.relay.Expr The computed result. """ - + # convert 2-way padding to 4-way padding + padding = get_pad_tuple2d(padding) return _make.bitserial_conv2d(data, weight, strides, padding, channels, kernel_size, activation_bits, weight_bits, data_layout, kernel_layout, pack_dtype,