You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by ns...@apache.org on 2018/08/20 14:40:51 UTC
[incubator-mxnet] branch master updated: Pad Operator Type Support
(#12035)
This is an automated email from the ASF dual-hosted git repository.
nswamy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new b03227d Pad Operator Type Support (#12035)
b03227d is described below
commit b03227d9dbd97f3cdd4c0ba8496e05797847a631
Author: Sebastian Bodenstein <se...@gmail.com>
AuthorDate: Mon Aug 20 16:40:38 2018 +0200
Pad Operator Type Support (#12035)
* fix no data type inference for pad
* add support for int types
* add tests for all types
* fix gpu type switch
* remove integer support
* fix python op test style issues
* fix type bug in python tests
---
src/operator/pad-inl.h | 11 +++++++++++
tests/python/unittest/test_operator.py | 24 ++++++++++++++----------
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/src/operator/pad-inl.h b/src/operator/pad-inl.h
index 520cd12..0b43e2d 100644
--- a/src/operator/pad-inl.h
+++ b/src/operator/pad-inl.h
@@ -189,6 +189,17 @@ class PadProp : public OperatorProperty {
return param_.__DICT__();
}
+ bool InferType(std::vector<int> *in_type,
+ std::vector<int> *out_type,
+ std::vector<int> *aux_type) const override {
+ int dtype = (*in_type)[0];
+ type_assign(&dtype, (*out_type)[0]);
+
+ TYPE_ASSIGN_CHECK(*in_type, 0, dtype);
+ TYPE_ASSIGN_CHECK(*out_type, 0, dtype);
+ return dtype != -1;
+ }
+
bool InferShape(std::vector<TShape> *in_shape, std::vector<TShape> *out_shape,
std::vector<TShape> *aux_shape) const override {
using namespace mshadow;
diff --git a/tests/python/unittest/test_operator.py b/tests/python/unittest/test_operator.py
index 04617de..125666b 100644
--- a/tests/python/unittest/test_operator.py
+++ b/tests/python/unittest/test_operator.py
@@ -3008,16 +3008,16 @@ def test_roipooling():
numeric_eps=1e-4, rtol=1e-1, atol=1E-4)
-def check_pad_with_shape(shape, xpu, pad_width, mode):
+def check_pad_with_shape(shape, xpu, pad_width, mode, dtype="float64"):
# bind with label
- X = mx.symbol.Variable('X')
+ X = mx.symbol.Variable('X', dtype=dtype)
Y = mx.symbol.Pad(data=X, mode=mode, pad_width=pad_width)
- x = mx.random.uniform(-1, 1, shape, ctx=mx.cpu()).copyto(xpu)
+ x = mx.random.uniform(-1, 1, shape, ctx=mx.cpu(), dtype=dtype).copyto(xpu)
# numpy result
pad_grouped = list(zip(*[iter(list(pad_width))] * 2))
np_out = np.pad(x.asnumpy(), pad_grouped, mode)
# mxnet result
- grad = mx.nd.empty(shape, ctx = xpu)
+ grad = mx.nd.empty(shape, ctx = xpu, dtype=dtype)
exec1 = Y.bind(xpu, args = [x], args_grad = {'X': grad})
exec1.forward(is_train=True)
out = exec1.outputs[0].asnumpy()
@@ -3029,16 +3029,20 @@ def check_pad_with_shape(shape, xpu, pad_width, mode):
@with_seed()
def test_pad():
+ ctx = default_context()
shape1 = (2, 3, 3, 5)
pad1 = (0, 0, 0, 0, 1, 2, 3, 4)
shape2 = (2, 3, 3, 5, 4)
pad2 = (0, 0, 0, 0, 1, 2, 3, 4, 3, 1)
- check_pad_with_shape(shape1, default_context(), pad1, 'constant')
- check_pad_with_shape(shape1, default_context(), pad1, 'edge')
- check_pad_with_shape(shape2, default_context(), pad2, 'constant')
- check_pad_with_shape(shape2, default_context(), pad2, 'edge')
- check_pad_with_shape(shape1, default_context(), pad1, 'reflect')
- check_pad_with_shape(shape2, default_context(), pad2, 'reflect')
+ # note: this op doesn't support ints yet. Add tests when supported
+ dtypes = ["float16", "float32", "float64"]
+ for dtype in dtypes:
+ check_pad_with_shape(shape1, ctx, pad1, 'constant', dtype)
+ check_pad_with_shape(shape1, ctx, pad1, 'edge', dtype)
+ check_pad_with_shape(shape2, ctx, pad2, 'constant', dtype)
+ check_pad_with_shape(shape2, ctx, pad2, 'edge', dtype)
+ check_pad_with_shape(shape1, ctx, pad1, 'reflect', dtype)
+ check_pad_with_shape(shape2, ctx, pad2, 'reflect', dtype)
def np_instance_norm(data, weight, bias, eps):