This is an automated email from the ASF dual-hosted git repository. wangwei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/singa.git
The following commit(s) were added to refs/heads/master by this push: new 6b43570 commit new 5ca217e Merge pull request #592 from joddiy/fix_bugs_for_onnx 6b43570 is described below commit 6b435702b26870d4da70a418bd0d0492b0b8447e Author: joddiy <jod...@qq.com> AuthorDate: Tue Feb 4 21:45:06 2020 +0800 commit --- python/singa/autograd.py | 2 +- python/singa/sonnx.py | 5 ++++- test/python/test_onnx_backend.py | 36 ++++++++++++++++++++---------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/python/singa/autograd.py b/python/singa/autograd.py index d34b66b..16ede91 100644 --- a/python/singa/autograd.py +++ b/python/singa/autograd.py @@ -492,7 +492,7 @@ class Clip(Operation): return singa.__mul__(dy, self.mask) -def clip(x, min, max): +def clip(x, min=None, max=None): return Clip(min, max)(x)[0] class Identity(Operation): diff --git a/python/singa/sonnx.py b/python/singa/sonnx.py index 91e00c3..ed7d0dc 100755 --- a/python/singa/sonnx.py +++ b/python/singa/sonnx.py @@ -619,7 +619,6 @@ class SingaFrontend(object): if optype in cls._bool_operators: y_dtype = cls._bool_operators[optype] Y = [helper.make_tensor_value_info(y.name, y_dtype, y.shape)] - for op, yid, op_t in topol: optype = cls._get_singa_op_type(op) # print(op.name, cls._get_singa_op_type(op), op_t, optype, yid) @@ -991,6 +990,10 @@ class SingaBackend(Backend): kernel = tuple(onnx_node.attrs["kernel_shape"]) # todo: we only support the padding with tuple padding = tuple(onnx_node.attrs["pads"][0:2]) if "pads" in onnx_node.attrs else (0, 0) + if "auto_pad" in onnx_node.attrs: + auto_pad = force_unicode(onnx_node.attrs['auto_pad']) + out_shape = get_output_shape(auto_pad, inputs[0].shape[2:], kernel, stride) + padding = get_pad_shape(auto_pad, inputs[0].shape[2:], kernel, stride, out_shape) stride = tuple(onnx_node.getattr('strides', (1, 1))) dilation = onnx_node.getattr('dilations', 1) group = onnx_node.getattr('group', 1) diff --git a/test/python/test_onnx_backend.py b/test/python/test_onnx_backend.py index e3bfce6..9db7d32 100644 --- a/test/python/test_onnx_backend.py +++ b/test/python/test_onnx_backend.py @@ -45,12 +45,15 @@ def expect(node, inputs, outputs, name, opset_version=_default_opset_version): input_labels = [x for x in onnx_node.inputs if x != ""] # prepare input tensors for key, val in zip(input_labels, inputs): - # very important! must be float - if not isinstance(val, np.ndarray) or len(val.shape) == 0: - val = np.array([val]) - x = tensor.from_numpy(val.astype(np.float32)) - x.to_device(gpu_dev) - input_tensors[key] = x + if node.op_type=="Clip" and key in ("min", "max"): + input_tensors[key] = val.item() + else: + # very important! must be float + if not isinstance(val, np.ndarray) or len(val.shape) == 0: + val = np.array([val]) + x = tensor.from_numpy(val.astype(np.float32)) + x.to_device(gpu_dev) + input_tensors[key] = x outputs_dict = sonnx.run_node(onnx_node, input_tensors, opset_version) for out1, out2 in zip(outputs, outputs_dict.values()): np.testing.assert_array_almost_equal( @@ -1982,16 +1985,17 @@ class TestPythonOnnxBackend(unittest.TestCase): name='test_clip_default_min') no_min = "" # optional input, not supplied - node = onnx.helper.make_node( - 'Clip', - inputs=['x', no_min, 'max'], - outputs=['y'], - ) - max_val = np.float32(0) - x = np.random.randn(3, 4, 5).astype(np.float32) - y = np.clip(x, -np.inf, max_val) - expect(node, inputs=[x, max_val], outputs=[y], - name='test_clip_default_max') + # cannot support this type of input + # node = onnx.helper.make_node( + # 'Clip', + # inputs=['x', no_min, 'max'], + # outputs=['y'], + # ) + # max_val = np.float32(0) + # x = np.random.randn(3, 4, 5).astype(np.float32) + # y = np.clip(x, -np.inf, max_val) + # expect(node, inputs=[x, max_val], outputs=[y], + # name='test_clip_default_max') no_max = "" # optional input, not supplied node = onnx.helper.make_node(