This is an automated email from the ASF dual-hosted git repository.
zha0q1 pushed a commit to branch v1.x
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/v1.x by this push:
new 209a789 [v1.x] ONNX Supoort for MXNet _contrib_BilinearResize2D op
(#19733)
209a789 is described below
commit 209a789e6cbc06d686b23893b892fbd58af6ffe8
Author: Zhaoqi Zhu <[email protected]>
AuthorDate: Sat Jan 9 16:27:56 2021 -0800
[v1.x] ONNX Supoort for MXNet _contrib_BilinearResize2D op (#19733)
* initial
* resize
* _contrib_BilinearResize2D
* restore sanity
---
.../mxnet/contrib/onnx/mx2onnx/_op_translations.py | 57 ++++++++++++++++++++++
tests/python-pytest/onnx/test_operators.py | 19 ++++++++
2 files changed, 76 insertions(+)
diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
index 07537a3..bc4b414 100644
--- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
+++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
@@ -2698,6 +2698,63 @@ def convert_arange_like(node, **kwargs):
return nodes
+
+@mx_op.register("_contrib_BilinearResize2D")
+def convert_contrib_BilinearResize2D(node, **kwargs):
+ """Map MXNet's contrib_BilinearResize2D operator attributes to onnx.
+ """
+ from onnx.helper import make_node
+ from onnx import TensorProto
+ name, input_nodes, attrs = get_inputs(node, kwargs)
+
+ opset_version = kwargs['opset_version']
+ if opset_version < 11:
+ raise AttributeError("ONNX opset 11 or greater is required to export
this operator")
+
+ height = int(attrs.get('height', 0))
+ width = int(attrs.get('width', 0))
+
+ scale_height = float(attrs.get('scale_height', 0))
+ scale_width = float(attrs.get('scale_width', 0))
+
+ if height * width == 0 and scale_height * scale_width == 0:
+ raise AttributeError('height, width or scale_height, scale_width
cannot be 0')
+
+ mode = attrs.get('mode', 'size')
+ if mode != 'size':
+ raise NotImplementedError('contrib_BilinearResize2D with mode other
than "size" is \
+ not supported')
+
+ nodes = [
+ create_tensor([], name+'_roi', kwargs['initializer'], dtype='float32'),
+ ]
+
+ if scale_height == 0:
+ nodes += [
+ create_tensor([0], name+'_0', kwargs['initializer']),
+ create_tensor([2], name+'_2', kwargs['initializer']),
+ create_tensor([height, width], name+'_h_w', kwargs['initializer'],
dtype='int64'),
+ make_node('Shape', [input_nodes[0]], [name+'_shape']),
+ make_node('Slice', [name+'_shape', name+'_0', name+'_2'],
[name+'_shape_01']),
+ make_node('Concat', [name+'_shape_01', name+'_h_w'],
[name+'_new_shape'], axis=0),
+ make_node('Cast', [name+'_shape'], [name+'_shape_f'],
to=int(TensorProto.FLOAT)),
+ make_node('Cast', [name+'_new_shape'], [name+'_new_shape_f'],
+ to=int(TensorProto.FLOAT)),
+ make_node('Div', [name+'_new_shape_f', name+'_shape_f'],
[name+'_scales']),
+ make_node('Resize', [input_nodes[0], name+'_roi', name+'_scales'],
[name],
+ mode='linear',
coordinate_transformation_mode='align_corners', name=name)
+ ]
+ else:
+ nodes += [
+ create_tensor([1, 1, scale_height, scale_width], name+'_scales',
kwargs['initializer'],
+ dtype='float32'),
+ make_node('Resize', [input_nodes[0], name+'_roi', name+'_scales'],
[name],
+ mode='linear',
coordinate_transformation_mode='align_corners', name=name)
+ ]
+
+ return nodes
+
+
@mx_op.register("_arange")
def convert_arange(node, **kwargs):
"""Map MXNet's arange operator attributes to onnx's Range operator.
diff --git a/tests/python-pytest/onnx/test_operators.py
b/tests/python-pytest/onnx/test_operators.py
index 34838a0..7800008 100644
--- a/tests/python-pytest/onnx/test_operators.py
+++ b/tests/python-pytest/onnx/test_operators.py
@@ -351,3 +351,22 @@ def test_onnx_export_softmax(tmp_path, dtype):
M4 = def_model('softmax', use_length=True, axis=1)
l4 = mx.nd.array([[2,0,3,1],[0,1,0,0]], dtype=int)
op_export_test('softmax_4', M4, [x, l4], tmp_path)
+
+
[email protected]('dtype', ['float16', 'float32', 'float64', 'int32',
'int64'])
[email protected]('params', [{'height': 7, 'width': 13},
+ {'height': 10, 'width': 16},
+ {'height': 3, 'width': 5},
+ {'height': 2, 'width': 4},
+ {'scale_height': 3, 'scale_width': 2},
+ {'scale_height': 1.7, 'scale_width': 2.3},
+ {'scale_height': 0.5, 'scale_width': 0.6},
+ {'scale_height': 0.8, 'scale_width': 0.1},
+ {'scale_height': 2.5, 'scale_width': 0.5},
+ {'scale_height': 3, 'scale_width':
0.00001},
+ ])
+def test_onnx_export_contrib_BilinearResize2D(tmp_path, dtype, params):
+ x = mx.nd.arange(0, 160).reshape((2, 2, 5, 8))
+ M = def_model('contrib.BilinearResize2D', **params)
+ op_export_test('contrib_BilinearResize2D', M, [x], tmp_path)
+