You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2018/09/28 18:57:52 UTC

[GitHub] sandeep-krishnamurthy closed pull request #12633: Onnx version update from 1.2.1 to 1.3 in CI

sandeep-krishnamurthy closed pull request #12633: Onnx version update from 1.2.1 to 1.3 in CI
URL: https://github.com/apache/incubator-mxnet/pull/12633
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/ci/docker/install/ubuntu_onnx.sh b/ci/docker/install/ubuntu_onnx.sh
index 737c333afb6..329352efd30 100755
--- a/ci/docker/install/ubuntu_onnx.sh
+++ b/ci/docker/install/ubuntu_onnx.sh
@@ -30,5 +30,5 @@ echo "Installing libprotobuf-dev and protobuf-compiler ..."
 apt-get install -y libprotobuf-dev protobuf-compiler
 
 echo "Installing pytest, pytest-cov, protobuf, Pillow, ONNX and tabulate ..."
-pip2 install pytest==3.4.0 pytest-cov==2.5.1 protobuf==3.5.2 onnx==1.2.1 Pillow==5.0.0 tabulate==0.7.5
-pip3 install pytest==3.4.0 pytest-cov==2.5.1 protobuf==3.5.2 onnx==1.2.1 Pillow==5.0.0 tabulate==0.7.5
+pip2 install pytest==3.4.0 pytest-cov==2.5.1 protobuf==3.5.2 onnx==1.3.0 Pillow==5.0.0 tabulate==0.7.5
+pip3 install pytest==3.4.0 pytest-cov==2.5.1 protobuf==3.5.2 onnx==1.3.0 Pillow==5.0.0 tabulate==0.7.5
diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
index 3ffac96a14e..204195d7409 100644
--- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
+++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py
@@ -64,11 +64,11 @@
 def import_onnx_modules():
     """ To make sure ONNX is runtime dependency, it is imported used only when needed"""
     try:
-        from onnx import helper, numpy_helper, mapping
+        import onnx
     except ImportError:
         raise ImportError("Onnx and protobuf need to be installed. "
                           + "Instructions to install - https://github.com/onnx/onnx")
-    return helper, numpy_helper, mapping
+    return onnx
 
 
 def parse_helper(attrs, attrs_name, alt_value=None):
@@ -131,21 +131,20 @@ def convert_string_to_list(string_val):
 def convert_weights_and_inputs(node, **kwargs):
     """Helper function to convert weights and inputs.
     """
-
-    helper, _, mapping = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
 
     if kwargs["is_input"] is False:
         weights = kwargs["weights"]
         initializer = kwargs["initializer"]
         np_arr = weights[name]
-        data_type = mapping.NP_TYPE_TO_TENSOR_TYPE[np_arr.dtype]
+        data_type = onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[np_arr.dtype]
         dims = np.shape(np_arr)
 
-        tensor_node = helper.make_tensor_value_info(name, data_type, dims)
+        tensor_node = onnx.helper.make_tensor_value_info(name, data_type, dims)
 
         initializer.append(
-            helper.make_tensor(
+            onnx.helper.make_tensor(
                 name=name,
                 data_type=data_type,
                 dims=dims,
@@ -156,7 +155,7 @@ def convert_weights_and_inputs(node, **kwargs):
 
         return [tensor_node]
     else:
-        tval_node = helper.make_tensor_value_info(name, kwargs["in_type"], kwargs["in_shape"])
+        tval_node = onnx.helper.make_tensor_value_info(name, kwargs["in_type"], kwargs["in_shape"])
         return [tval_node]
 
 
@@ -165,7 +164,7 @@ def convert_convolution(node, **kwargs):
     """Map MXNet's convolution operator attributes to onnx's Conv operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
 
@@ -192,7 +191,7 @@ def convert_convolution(node, **kwargs):
     if num_inputs > 2:
         input_nodes.append(bias_node)
 
-    conv_node = helper.make_node(
+    conv_node = onnx.helper.make_node(
         "Conv",
         inputs=input_nodes,
         outputs=[name],
@@ -212,7 +211,7 @@ def convert_fully_connected(node, **kwargs):
     """Map MXNet's FullyConnected operator attributes to onnx's Gemm operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
@@ -227,7 +226,7 @@ def convert_fully_connected(node, **kwargs):
     weights_name = weights_node.name
     bias_name = bias_node.name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Gemm",
         [input_name, weights_name, bias_name],  # input (A, B, C) - C can be in place
         [name],  # output
@@ -246,7 +245,7 @@ def convert_batchnorm(node, **kwargs):
     """Map MXNet's BatchNorm operator attributes to onnx's BatchNormalization operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -269,7 +268,7 @@ def convert_batchnorm(node, **kwargs):
     mov_mean_node = mov_mean_node.name
     mov_var_node = proc_nodes[moving_var_idx].name
 
-    bn_node = helper.make_node(
+    bn_node = onnx.helper.make_node(
         "BatchNormalization",
         [data_node,
          gamma_node,  # scale
@@ -293,14 +292,14 @@ def convert_tanh(node, **kwargs):
     """Map MXNet's tanh operator attributes to onnx's Tanh operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Tanh',
         [input_node],
         [name],
@@ -313,14 +312,14 @@ def convert_cos(node, **kwargs):
     """Map MXNet's cos operator attributes to onnx's Cos operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Cos',
         [input_node],
         [name],
@@ -333,14 +332,14 @@ def convert_sin(node, **kwargs):
     """Map MXNet's sin operator attributes to onnx's Sin operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Sin',
         [input_node],
         [name],
@@ -353,14 +352,14 @@ def convert_tan(node, **kwargs):
     """Map MXNet's tan operator attributes to onnx's tan operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Tan',
         [input_node],
         [name],
@@ -373,14 +372,14 @@ def convert_acos(node, **kwargs):
     """Map MXNet's acos operator attributes to onnx's acos operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Acos',
         [input_node],
         [name],
@@ -393,14 +392,14 @@ def convert_asin(node, **kwargs):
     """Map MXNet's asin operator attributes to onnx's asin operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Asin',
         [input_node],
         [name],
@@ -413,14 +412,14 @@ def convert_atan(node, **kwargs):
     """Map MXNet's atan operator attributes to onnx's atan operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Atan',
         [input_node],
         [name],
@@ -434,14 +433,14 @@ def convert_sigmoid(node, **kwargs):
     """Map MXNet's sigmoid operator attributes to onnx's Sigmoid operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Sigmoid',
         [input_node],
         [name],
@@ -454,14 +453,14 @@ def convert_relu(node, **kwargs):
     """Map MXNet's relu operator attributes to onnx's Relu operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     input_node_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_node_idx].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Relu',
         [input_node],
         [name],
@@ -475,7 +474,7 @@ def convert_activation(node, **kwargs):
     """Map MXNet's Activation operator attributes to onnx's Tanh/Relu operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
 
     proc_nodes = kwargs["proc_nodes"]
@@ -498,7 +497,7 @@ def convert_activation(node, **kwargs):
 
     act_name = act_types.get(act_type)
     if act_name:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             act_name,
             [input_node],
             [name],
@@ -517,7 +516,7 @@ def convert_pad(node, **kwargs):
     """Map MXNet's pad operator attributes to onnx's Pad operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     attrs = node["attrs"]
     proc_nodes = kwargs["proc_nodes"]
@@ -533,7 +532,7 @@ def convert_pad(node, **kwargs):
     if pad_mode == "constant":
         pad_value = float(attrs.get("constant_value")) \
             if "constant_value" in attrs else 0.0
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'Pad',
             inputs=[input_node],
             outputs=[name],
@@ -543,7 +542,7 @@ def convert_pad(node, **kwargs):
             name=name
         )
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'Pad',
             inputs=[input_node],
             outputs=[name],
@@ -557,10 +556,10 @@ def convert_pad(node, **kwargs):
 
 def create_helper_trans_node(op_name, input_node, node_name):
     """create extra transpose node for dot operator"""
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
 
     node_name = op_name + "_" + node_name
-    trans_node = helper.make_node(
+    trans_node = onnx.helper.make_node(
         'Transpose',
         inputs=[input_node],
         outputs=[node_name],
@@ -574,7 +573,7 @@ def convert_dot(node, **kwargs):
     """Map MXNet's dot operator attributes to onnx's
     MatMul and Transpose operators based on the values set for
     transpose_a, transpose_b attributes."""
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
     name = node["name"]
@@ -604,7 +603,7 @@ def convert_dot(node, **kwargs):
         trans_b_node = create_helper_trans_node(op_name, input_node_b, 'b')
         input_node_b = op_name+"_b"
 
-    matmul_node = helper.make_node(
+    matmul_node = onnx.helper.make_node(
         'MatMul',
         inputs=[input_node_a, input_node_b],
         outputs=[name],
@@ -628,7 +627,7 @@ def convert_linalg_gemm2(node, **kwargs):
     transpose_a, transpose_b attributes.
     Return multiple nodes created.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
     name = node["name"]
@@ -652,7 +651,7 @@ def convert_linalg_gemm2(node, **kwargs):
     op_name = "transpose" + str(kwargs["idx"])
 
     if alpha == 1.0 and trans_a == 0 and trans_b == 0:
-        matmul_node = helper.make_node(
+        matmul_node = onnx.helper.make_node(
             'MatMul',
             inputs=[input_node_a, input_node_b],
             outputs=[name],
@@ -662,14 +661,14 @@ def convert_linalg_gemm2(node, **kwargs):
     elif trans_a == 1 and trans_b == 0:
         op_name = "transpose" + str(kwargs["idx"])
         node_name = op_name+"_a"
-        trans_a_node = helper.make_node(
+        trans_a_node = onnx.helper.make_node(
             'Transpose',
             inputs=[input_node_a],
             outputs=[op_name+"_a"],
             name=node_name
         )
 
-        matmul_node = helper.make_node(
+        matmul_node = onnx.helper.make_node(
             'MatMul',
             inputs=[node_name, input_node_b],
             outputs=[name],
@@ -679,14 +678,14 @@ def convert_linalg_gemm2(node, **kwargs):
 
     elif trans_a == 0 and trans_b == 1:
         node_name = op_name + "_b"
-        trans_b_node = helper.make_node(
+        trans_b_node = onnx.helper.make_node(
             'Transpose',
             inputs=[input_node_b],
             outputs=[op_name+"_b"],
             name=node_name
         )
 
-        matmul_node = helper.make_node(
+        matmul_node = onnx.helper.make_node(
             'MatMul',
             inputs=[input_node_a, node_name],
             outputs=[name],
@@ -696,7 +695,7 @@ def convert_linalg_gemm2(node, **kwargs):
         return [trans_b_node, matmul_node]
     else:
         node_name_a = op_name+"_a"
-        trans_a_node = helper.make_node(
+        trans_a_node = onnx.helper.make_node(
             'Transpose',
             inputs=[input_node_a],
             outputs=[op_name+"_a"],
@@ -704,14 +703,14 @@ def convert_linalg_gemm2(node, **kwargs):
         )
 
         node_name_b = op_name + "_b"
-        trans_b_node = helper.make_node(
+        trans_b_node = onnx.helper.make_node(
             'Transpose',
             inputs=[input_node_b],
             outputs=[op_name+"_b"],
             name=node_name_b
         )
 
-        matmul_node = helper.make_node(
+        matmul_node = onnx.helper.make_node(
             'MatMul',
             inputs=[node_name_a, node_name_b],
             outputs=[name],
@@ -727,7 +726,7 @@ def convert_pooling(node, **kwargs):
     MaxPool/AveragePool/GlobalMaxPool/GlobalAveragePool operators
     based on the input node's attributes and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     attrs = node["attrs"]
     kernel = eval(attrs["kernel"])
@@ -755,14 +754,14 @@ def convert_pooling(node, **kwargs):
     global_pool_types = {"max": "GlobalMaxPool", "avg": "GlobalAveragePool"}
 
     if global_pool:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             global_pool_types[pool_type],
             [input_node.name],  # input
             [name],
             name=name
         )
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             pool_types[pool_type],
             [input_node.name],  # input
             [name],
@@ -780,7 +779,7 @@ def convert_exp(node, **kwargs):
     """Map MXNet's exp operator attributes to onnx's Exp operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -788,7 +787,7 @@ def convert_exp(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Exp",
         [input_node],
         [name],
@@ -802,7 +801,7 @@ def convert_identity(node, **kwargs):
     """Map MXNet's _copy operator attributes to onnx's Identity operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -810,7 +809,7 @@ def convert_identity(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Identity",
         [input_node],
         [name],
@@ -824,7 +823,7 @@ def convert_leakyrelu(node, **kwargs):
     """Map MXNet's LeakyReLU operator attributes to onnx's Elu/LeakyRelu/PRelu operators
     based on the input node's attributes and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -841,13 +840,13 @@ def convert_leakyrelu(node, **kwargs):
         alpha_node_index = kwargs["index_lookup"][inputs[1][0]]
         alpha_node_name = proc_nodes[alpha_node_index].name
 
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             act_name[act_type],
             inputs=[input_node, alpha_node_name],
             outputs=[name],
             name=name)
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             act_name[act_type],
             inputs=[input_node],
             outputs=[name],
@@ -862,7 +861,7 @@ def convert_softmax(node, **kwargs):
     """Map MXNet's softmax operator attributes to onnx's Softmax operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     inputs = node["inputs"]
     input_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
@@ -871,7 +870,7 @@ def convert_softmax(node, **kwargs):
     name = node["name"]
     axis = int(node.get("attrs", {}).get("axis", -1))
 
-    softmax_node = helper.make_node(
+    softmax_node = onnx.helper.make_node(
         "Softmax",
         [input_node.name],
         [name],
@@ -889,14 +888,14 @@ def convert_softmax_output(node, **kwargs):
     """Map MXNet's SoftmaxOutput operator attributes to onnx's Softmax operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     inputs = node["inputs"]
     input1_idx = kwargs["index_lookup"][inputs[0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input1 = proc_nodes[input1_idx]
     name = node["name"]
 
-    softmax_node = helper.make_node(
+    softmax_node = onnx.helper.make_node(
         "Softmax",
         [input1.output[0]],
         [name],
@@ -912,13 +911,13 @@ def convert_concat(node, **kwargs):
     """Map MXNet's Concat operator attributes to onnx's Concat operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     inputs = node["inputs"]
     proc_nodes = kwargs["proc_nodes"]
     input_names = [proc_nodes[kwargs["index_lookup"][i[0]]].name for i in inputs]
     axis = int(node.get("attrs", {}).get("dim", 1))
-    concat_node = helper.make_node(
+    concat_node = onnx.helper.make_node(
         "Concat",
         input_names,
         [name],
@@ -933,7 +932,7 @@ def convert_transpose(node, **kwargs):
     """Map MXNet's transpose operator attributes to onnx's Transpose operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_idx = kwargs["index_lookup"][node["inputs"][0][0]]
     proc_nodes = kwargs["proc_nodes"]
@@ -942,7 +941,7 @@ def convert_transpose(node, **kwargs):
     if axes:
         axes = tuple(map(int, re.findall(r'\d+', axes)))
 
-        transpose_node = helper.make_node(
+        transpose_node = onnx.helper.make_node(
             "Transpose",
             [input_node],
             [name],
@@ -950,7 +949,7 @@ def convert_transpose(node, **kwargs):
             name=name
         )
     else:
-        transpose_node = helper.make_node(
+        transpose_node = onnx.helper.make_node(
             "Transpose",
             [input_node],
             [name],
@@ -965,7 +964,7 @@ def convert_lrn(node, **kwargs):
     """Map MXNet's LRN operator attributes to onnx's LRN operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_idx = kwargs["index_lookup"][node["inputs"][0][0]]
     proc_nodes = kwargs["proc_nodes"]
@@ -977,7 +976,7 @@ def convert_lrn(node, **kwargs):
     bias = float(attrs["knorm"]) if "knorm" in attrs else 1.0
     size = int(attrs["nsize"])
 
-    lrn_node = helper.make_node(
+    lrn_node = onnx.helper.make_node(
         "LRN",
         inputs=[input_node],
         outputs=[name],
@@ -996,7 +995,7 @@ def convert_l2normalization(node, **kwargs):
     """Map MXNet's L2Normalization operator attributes to onnx's LpNormalization operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_id = kwargs["index_lookup"][node["inputs"][0][0]]
     input_name = kwargs["proc_nodes"][input_id].name
@@ -1006,7 +1005,7 @@ def convert_l2normalization(node, **kwargs):
     if mode != "channel":
         raise AttributeError("ONNX currently supports channel mode only")
 
-    l2norm_node = helper.make_node(
+    l2norm_node = onnx.helper.make_node(
         "LpNormalization",
         [input_name],
         [name],
@@ -1021,14 +1020,14 @@ def convert_dropout(node, **kwargs):
     """Map MXNet's Dropout operator attributes to onnx's Dropout operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_id = kwargs["index_lookup"][node["inputs"][0][0]]
     input_name = kwargs["proc_nodes"][input_id].name
     attrs = node["attrs"]
     probability = float(attrs["p"])
 
-    dropout_node = helper.make_node(
+    dropout_node = onnx.helper.make_node(
         "Dropout",
         [input_name],
         [name],
@@ -1043,13 +1042,13 @@ def convert_flatten(node, **kwargs):
     """Map MXNet's Flatten operator attributes to onnx's Flatten operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_idx = kwargs["index_lookup"][node["inputs"][0][0]]
     proc_nodes = kwargs["proc_nodes"]
     input_node = proc_nodes[input_idx].name  # .output[0]
 
-    flatten_node = helper.make_node(
+    flatten_node = onnx.helper.make_node(
         "Flatten",
         [input_node],
         [name],
@@ -1062,7 +1061,7 @@ def convert_clip(node, **kwargs):
     """Map MXNet's Clip operator attributes to onnx's Clip operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     input_idx = kwargs["index_lookup"][node["inputs"][0][0]]
     proc_nodes = kwargs["proc_nodes"]
@@ -1071,7 +1070,7 @@ def convert_clip(node, **kwargs):
     a_min = np.float(attrs.get('a_min', -np.inf))
     a_max = np.float(attrs.get('a_max', np.inf))
 
-    clip_node = helper.make_node(
+    clip_node = onnx.helper.make_node(
         "Clip",
         [input_node],
         [name],
@@ -1084,7 +1083,7 @@ def convert_clip(node, **kwargs):
 
 def scalar_op_helper(node, op_name, **kwargs):
     """Helper function for scalar arithmetic operations"""
-    helper, numpy_helper, mapping = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1100,27 +1099,27 @@ def scalar_op_helper(node, op_name, **kwargs):
     for i in initializer:
         if i.name == input_node:
             if op_name == 'Mul':
-                new_initializer = numpy_helper.to_array(i) * scalar_value[0]
+                new_initializer = onnx.numpy_helper.to_array(i) * scalar_value[0]
             elif op_name == 'Sub':
-                new_initializer = numpy_helper.to_array(i) - scalar_value[0]
+                new_initializer = onnx.numpy_helper.to_array(i) - scalar_value[0]
             elif op_name == 'Add':
-                new_initializer = numpy_helper.to_array(i) + scalar_value[0]
+                new_initializer = onnx.numpy_helper.to_array(i) + scalar_value[0]
             elif op_name == 'Div':
-                new_initializer = numpy_helper.to_array(i) / scalar_value[0]
+                new_initializer = onnx.numpy_helper.to_array(i) / scalar_value[0]
             flag = False
             break
 
     # else create a new tensor of the scalar value, add it in initializer
     if flag is True:
         np_arr = np.array(scalar_value)
-        data_type = mapping.NP_TYPE_TO_TENSOR_TYPE[np_arr.dtype]
+        data_type = onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[np_arr.dtype]
         dims = np.shape(np_arr)
 
         scalar_op_name = "scalar_op" + str(kwargs["idx"])
-        tensor_node = helper.make_tensor_value_info(scalar_op_name, data_type, dims)
+        tensor_node = onnx.helper.make_tensor_value_info(scalar_op_name, data_type, dims)
 
         initializer.append(
-            helper.make_tensor(
+            onnx.helper.make_tensor(
                 name=scalar_op_name,
                 data_type=data_type,
                 dims=dims,
@@ -1129,7 +1128,7 @@ def scalar_op_helper(node, op_name, **kwargs):
             )
         )
 
-        mul_node = helper.make_node(
+        mul_node = onnx.helper.make_node(
             op_name,
             [input_node, scalar_op_name],
             [name],
@@ -1138,14 +1137,14 @@ def scalar_op_helper(node, op_name, **kwargs):
 
         return [tensor_node, mul_node]
     else:
-        data_type = mapping.NP_TYPE_TO_TENSOR_TYPE[new_initializer.dtype]
+        data_type = onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[new_initializer.dtype]
         dims = np.shape(new_initializer)
 
         new_a_node = input_node + str(kwargs["idx"])
-        tensor_node = helper.make_tensor_value_info(new_a_node, data_type, dims)
+        tensor_node = onnx.helper.make_tensor_value_info(new_a_node, data_type, dims)
 
         initializer.append(
-            helper.make_tensor(
+            onnx.helper.make_tensor(
                 name=new_a_node,
                 data_type=data_type,
                 dims=dims,
@@ -1200,7 +1199,7 @@ def convert_argmax(node, **kwargs):
     """Map MXNet's argmax operator attributes to onnx's ArgMax operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
 
@@ -1212,7 +1211,7 @@ def convert_argmax(node, **kwargs):
     axis = int(attrs.get("axis"))
     keepdims = int(attrs.get("keepdims")) if "keepdims" in attrs  else 1
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'ArgMax',
         inputs=[input_node],
         axis=axis,
@@ -1227,7 +1226,7 @@ def convert_argmin(node, **kwargs):
     """Map MXNet's argmin operator attributes to onnx's ArgMin operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
 
@@ -1239,7 +1238,7 @@ def convert_argmin(node, **kwargs):
     axis = int(attrs.get("axis"))
     keepdims = int(attrs.get("keepdims")) if "keepdims" in attrs  else 1
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'ArgMin',
         inputs=[input_node],
         axis=axis,
@@ -1254,7 +1253,7 @@ def convert_maximum(node, **kwargs):
     """Map MXNet's _maximum operator attributes to onnx's Max operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
 
@@ -1265,7 +1264,7 @@ def convert_maximum(node, **kwargs):
 
     name = node["name"]
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Max',
         inputs=input_node_list,
         outputs=[name],
@@ -1280,7 +1279,7 @@ def convert_minimum(node, **kwargs):
     """Map MXNet's _minimum operator attributes to onnx's Min operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     proc_nodes = kwargs["proc_nodes"]
     node_inputs = node["inputs"]
 
@@ -1291,7 +1290,7 @@ def convert_minimum(node, **kwargs):
 
     name = node["name"]
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         'Min',
         inputs=input_node_list,
         outputs=[name],
@@ -1306,7 +1305,7 @@ def convert_min(node, **kwargs):
     """Map MXNet's min operator attributes to onnx's ReduceMin operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1320,7 +1319,7 @@ def convert_min(node, **kwargs):
     input_node = proc_nodes[input_node_id].name
 
     if axes is not None:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMin',
             inputs=[input_node],
             outputs=[name],
@@ -1331,7 +1330,7 @@ def convert_min(node, **kwargs):
 
         return [node]
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMin',
             inputs=[input_node],
             outputs=[name],
@@ -1347,7 +1346,7 @@ def convert_max(node, **kwargs):
     """Map MXNet's max operator attributes to onnx's ReduceMax operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1361,7 +1360,7 @@ def convert_max(node, **kwargs):
     input_node = proc_nodes[input_node_id].name
 
     if axes is not None:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMax',
             inputs=[input_node],
             outputs=[name],
@@ -1372,7 +1371,7 @@ def convert_max(node, **kwargs):
 
         return [node]
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMax',
             inputs=[input_node],
             outputs=[name],
@@ -1388,7 +1387,7 @@ def convert_mean(node, **kwargs):
     """Map MXNet's mean operator attributes to onnx's ReduceMean operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1402,7 +1401,7 @@ def convert_mean(node, **kwargs):
     input_node = proc_nodes[input_node_id].name
 
     if axes is not None:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMean',
             inputs=[input_node],
             outputs=[name],
@@ -1413,7 +1412,7 @@ def convert_mean(node, **kwargs):
 
         return [node]
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceMean',
             inputs=[input_node],
             outputs=[name],
@@ -1429,7 +1428,7 @@ def convert_prod(node, **kwargs):
     """Map MXNet's prod operator attributes to onnx's ReduceProd operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1443,7 +1442,7 @@ def convert_prod(node, **kwargs):
     input_node = proc_nodes[input_node_id].name
 
     if axes is not None:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceProd',
             inputs=[input_node],
             outputs=[name],
@@ -1454,7 +1453,7 @@ def convert_prod(node, **kwargs):
 
         return [node]
     else:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             'ReduceProd',
             inputs=[input_node],
             outputs=[name],
@@ -1471,7 +1470,7 @@ def convert_elementwise_add(node, **kwargs):
     """Map MXNet's elemwise_add operator attributes to onnx's Add operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1482,7 +1481,7 @@ def convert_elementwise_add(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    add_node = helper.make_node(
+    add_node = onnx.helper.make_node(
         "Add",
         [input_node_a, input_node_b],
         [name],
@@ -1497,7 +1496,7 @@ def covert_broadcast_add(node, **kwargs):
     """Map MXNet's broadcast_add operator attributes to onnx's Add operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1508,7 +1507,7 @@ def covert_broadcast_add(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    add_node = helper.make_node(
+    add_node = onnx.helper.make_node(
         "Add",
         [input_node_a, input_node_b],
         [name],
@@ -1523,7 +1522,7 @@ def convert_elementwise_sub(node, **kwargs):
     """Map MXNet's elemwise_sub operator attributes to onnx's Sub operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1534,7 +1533,7 @@ def convert_elementwise_sub(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    sub_node = helper.make_node(
+    sub_node = onnx.helper.make_node(
         "Sub",
         [input_node_a, input_node_b],
         [name],
@@ -1548,7 +1547,7 @@ def covert_broadcast_sub(node, **kwargs):
     """Map MXNet's broadcast_sub operator attributes to onnx's Sub operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1559,7 +1558,7 @@ def covert_broadcast_sub(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    sub_node = helper.make_node(
+    sub_node = onnx.helper.make_node(
         "Sub",
         [input_node_a, input_node_b],
         [name],
@@ -1574,7 +1573,7 @@ def convert_elemwise_mul(node, **kwargs):
     """Map MXNet's elemwise_mul operator attributes to onnx's Mul operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1585,7 +1584,7 @@ def convert_elemwise_mul(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    mul_node = helper.make_node(
+    mul_node = onnx.helper.make_node(
         "Mul",
         [input_node_a, input_node_b],
         [name],
@@ -1599,7 +1598,7 @@ def convert_broadcast_mul(node, **kwargs):
     """Map MXNet's broadcast_mul operator attributes to onnx's Mul operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1610,7 +1609,7 @@ def convert_broadcast_mul(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    mul_node = helper.make_node(
+    mul_node = onnx.helper.make_node(
         "Mul",
         [input_node_a, input_node_b],
         [name],
@@ -1625,7 +1624,7 @@ def convert_elemwise_div(node, **kwargs):
     """Map MXNet's elemwise_div operator attributes to onnx's Div operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1636,7 +1635,7 @@ def convert_elemwise_div(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    div_node = helper.make_node(
+    div_node = onnx.helper.make_node(
         "Div",
         [input_node_a, input_node_b],
         [name],
@@ -1651,7 +1650,7 @@ def convert_broadcast_div(node, **kwargs):
     """Map MXNet's broadcast_div operator attributes to onnx's Div operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1662,7 +1661,7 @@ def convert_broadcast_div(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    div_node = helper.make_node(
+    div_node = onnx.helper.make_node(
         "Div",
         [input_node_a, input_node_b],
         [name],
@@ -1677,7 +1676,7 @@ def convert_negative(node, **kwargs):
     """Map MXNet's negative operator attributes to onnx's Neg operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1686,7 +1685,7 @@ def convert_negative(node, **kwargs):
 
     input_node = proc_nodes[input_node_id].name
 
-    neg_node = helper.make_node(
+    neg_node = onnx.helper.make_node(
         "Neg",
         [input_node],
         [name],
@@ -1701,7 +1700,7 @@ def convert_abs(node, **kwargs):
     """Map MXNet's abs operator attributes to onnx's Abs operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1710,7 +1709,7 @@ def convert_abs(node, **kwargs):
 
     input_node = proc_nodes[input_node_id].name
 
-    abs_node = helper.make_node(
+    abs_node = onnx.helper.make_node(
         "Abs",
         [input_node],
         [name],
@@ -1725,7 +1724,7 @@ def convert_addn(node, **kwargs):
     """Map MXNet's add_n operator attributes to onnx's Sum operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1734,7 +1733,7 @@ def convert_addn(node, **kwargs):
     for input_val in inputs:
         input_list.append(proc_nodes[kwargs["index_lookup"][input_val[0]]].name)
 
-    sum_node = helper.make_node(
+    sum_node = onnx.helper.make_node(
         "Sum",
         input_list,
         [name],
@@ -1748,7 +1747,7 @@ def convert_ceil(node, **kwargs):
     """Map MXNet's ceil operator attributes to onnx's Ceil operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1756,7 +1755,7 @@ def convert_ceil(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Ceil",
         [input_node],
         [name],
@@ -1769,7 +1768,7 @@ def convert_floor(node, **kwargs):
     """Map MXNet's floor operator attributes to onnx's Floor operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1777,7 +1776,7 @@ def convert_floor(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Floor",
         [input_node],
         [name],
@@ -1792,7 +1791,7 @@ def convert_reshape(node, **kwargs):
     Converts output shape attribute to output shape tensor
     and return multiple created nodes.
     """
-    helper, _, mapping = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1802,14 +1801,14 @@ def convert_reshape(node, **kwargs):
 
     initializer = kwargs["initializer"]
     output_shape_np = np.array(output_shape_list)
-    data_type = mapping.NP_TYPE_TO_TENSOR_TYPE[output_shape_np.dtype]
+    data_type = onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[output_shape_np.dtype]
     dims = np.shape(output_shape_np)
 
     output_shape_name = "reshape_attr_tensor" + str(kwargs["idx"])
-    tensor_node = helper.make_tensor_value_info(output_shape_name, data_type, dims)
+    tensor_node = onnx.helper.make_tensor_value_info(output_shape_name, data_type, dims)
 
     initializer.append(
-        helper.make_tensor(
+        onnx.helper.make_tensor(
             name=output_shape_name,
             data_type=data_type,
             dims=dims,
@@ -1827,7 +1826,7 @@ def convert_reshape(node, **kwargs):
         if val in not_supported_shape:
             raise AttributeError("Shape value not supported in ONNX", val)
 
-    reshape_node = helper.make_node(
+    reshape_node = onnx.helper.make_node(
         "Reshape",
         [input_node_name, output_shape_name],
         [name],
@@ -1841,20 +1840,28 @@ def convert_cast(node, **kwargs):
     """Map MXNet's Cast operator attributes to onnx's Cast operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
     dtype = node["attrs"]["dtype"]
 
+    # dtype can be mapped only with types from TensorProto
+    # float32 is mapped to float and float64 to double in onnx
+    # following tensorproto mapping https://github.com/onnx/onnx/blob/master/onnx/mapping.py
+    if dtype == 'float32':
+        dtype = 'float'
+    elif dtype == 'float64':
+        dtype = 'double'
+
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Cast",
         [input_node],
         [name],
-        to=dtype,
+        to=getattr(onnx.TensorProto, dtype.upper()),
         name=name,
     )
     return [node]
@@ -1865,7 +1872,7 @@ def convert_slice_axis(node, **kwargs):
     """Map MXNet's slice_axis operator attributes to onnx's Slice operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1879,7 +1886,7 @@ def convert_slice_axis(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Slice",
         [input_node],
         [name],
@@ -1897,7 +1904,7 @@ def convert_slice_channel(node, **kwargs):
     operator based on squeeze_axis attribute
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1909,7 +1916,7 @@ def convert_slice_channel(node, **kwargs):
     input_node = proc_nodes[input_node_id].name
 
     if squeeze_axis == 1 and num_outputs == 1:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             "Squeeze",
             [input_node],
             [name],
@@ -1918,7 +1925,7 @@ def convert_slice_channel(node, **kwargs):
         )
         return [node]
     elif squeeze_axis == 0 and num_outputs > 1:
-        node = helper.make_node(
+        node = onnx.helper.make_node(
             "Split",
             [input_node],
             [name],
@@ -1937,7 +1944,7 @@ def convert_expand_dims(node, **kwargs):
     """Map MXNet's expand_dims operator attributes to onnx's Unsqueeze operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1946,7 +1953,7 @@ def convert_expand_dims(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Unsqueeze",
         [input_node],
         [name],
@@ -1960,7 +1967,7 @@ def convert_squeeze(node, **kwargs):
     """Map MXNet's squeeze operator attributes to onnx's squeeze operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1973,7 +1980,7 @@ def convert_squeeze(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Squeeze",
         [input_node],
         [name],
@@ -1988,7 +1995,7 @@ def convert_log(node, **kwargs):
     """Map MXNet's log operator attributes to onnx's Log operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -1996,7 +2003,7 @@ def convert_log(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Log",
         [input_node],
         [name],
@@ -2010,7 +2017,7 @@ def convert_reciprocal(node, **kwargs):
     """Map MXNet's reciprocal operator attributes to onnx's Reciprocal operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -2018,7 +2025,7 @@ def convert_reciprocal(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Reciprocal",
         [input_node],
         [name],
@@ -2026,13 +2033,12 @@ def convert_reciprocal(node, **kwargs):
     )
     return [node]
 
-
 @mx_op.register("_power")
 def convert_power(node, **kwargs):
     """Map MXNet's _power operator attributes to onnx's Pow operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -2043,7 +2049,7 @@ def convert_power(node, **kwargs):
     input_node_a = proc_nodes[input_node_a_id].name
     input_node_b = proc_nodes[input_node_b_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Pow",
         [input_node_a, input_node_b],
         [name],
@@ -2056,7 +2062,7 @@ def convert_sqrt(node, **kwargs):
     """Map MXNet's sqrt operator attributes to onnx's Sqrt operator
     and return the created node.
     """
-    helper, _, _ = import_onnx_modules()
+    onnx = import_onnx_modules()
     name = node["name"]
     proc_nodes = kwargs["proc_nodes"]
     inputs = node["inputs"]
@@ -2064,7 +2070,7 @@ def convert_sqrt(node, **kwargs):
     input_node_id = kwargs["index_lookup"][inputs[0][0]]
     input_node = proc_nodes[input_node_id].name
 
-    node = helper.make_node(
+    node = onnx.helper.make_node(
         "Sqrt",
         [input_node],
         [name],
diff --git a/python/mxnet/contrib/onnx/onnx2mx/_op_translations.py b/python/mxnet/contrib/onnx/onnx2mx/_op_translations.py
index 4d1e9561230..5f3b756d172 100644
--- a/python/mxnet/contrib/onnx/onnx2mx/_op_translations.py
+++ b/python/mxnet/contrib/onnx/onnx2mx/_op_translations.py
@@ -118,11 +118,21 @@ def add_n(attrs, inputs, proto_obj):
 # Sorting and Searching
 def argmax(attrs, inputs, proto_obj):
     """Returns indices of the maximum values along an axis"""
-    return 'argmax', attrs, inputs
+    axis = attrs.get('axis', 0)
+    keepdims = attrs.get('keepdims', 1)
+    argmax_op = symbol.argmax(inputs[0], axis=axis, keepdims=keepdims)
+    # onnx argmax operator always expects int64 as output type
+    cast_attrs = {'dtype': 'int64'}
+    return 'cast', cast_attrs, argmax_op
 
 def argmin(attrs, inputs, proto_obj):
     """Returns indices of the minimum values along an axis."""
-    return 'argmin', attrs, inputs
+    axis = attrs.get('axis', 0)
+    keepdims = attrs.get('keepdims', 1)
+    argmin_op = symbol.argmin(inputs[0], axis=axis, keepdims=keepdims)
+    # onnx argmax operator always expects int64 as output type
+    cast_attrs = {'dtype': 'int64'}
+    return 'cast', cast_attrs, argmin_op
 
 def maximum(attrs, inputs, proto_obj):
     """
@@ -231,6 +241,7 @@ def batch_norm(attrs, inputs, proto_obj):
 def instance_norm(attrs, inputs, proto_obj):
     """Instance Normalization."""
     new_attrs = translation_utils._fix_attribute_names(attrs, {'epsilon' : 'eps'})
+    new_attrs['eps'] = attrs.get('epsilon', 1e-5)
     return 'InstanceNorm', new_attrs, inputs
 
 def leaky_relu(attrs, inputs, proto_obj):
@@ -422,8 +433,13 @@ def reshape(attrs, inputs, proto_obj):
 
 def cast(attrs, inputs, proto_obj):
     """ Cast input to a given dtype"""
+    try:
+        from onnx.mapping import TENSOR_TYPE_TO_NP_TYPE
+    except ImportError:
+        raise ImportError("Onnx and protobuf need to be installed. "
+                          + "Instructions to install - https://github.com/onnx/onnx")
     new_attrs = translation_utils._fix_attribute_names(attrs, {'to' : 'dtype'})
-    new_attrs['dtype'] = new_attrs['dtype'].lower()
+    new_attrs['dtype'] = TENSOR_TYPE_TO_NP_TYPE[int(new_attrs['dtype'])]
     return 'cast', new_attrs, inputs
 
 def split(attrs, inputs, proto_obj):
diff --git a/tests/python-pytest/onnx/export/onnx_backend_test.py b/tests/python-pytest/onnx/export/onnx_backend_test.py
index 01ae09402ef..2216a8f407f 100644
--- a/tests/python-pytest/onnx/export/onnx_backend_test.py
+++ b/tests/python-pytest/onnx/export/onnx_backend_test.py
@@ -80,7 +80,7 @@
     'test_reciprocal',
     'test_sqrt',
     'test_pow',
-    'test_exp',
+    'test_exp_',
     'test_argmax',
     'test_argmin',
     'test_min',
@@ -91,6 +91,7 @@
     'test_operator_params',
     'test_operator_permute2',
     'test_clip'
+    'test_cast'
     ]
 
 BASIC_MODEL_TESTS = [
diff --git a/tests/python-pytest/onnx/import/mxnet_backend_rep.py b/tests/python-pytest/onnx/import/mxnet_backend_rep.py
index 31a1935b187..938f25d38bf 100644
--- a/tests/python-pytest/onnx/import/mxnet_backend_rep.py
+++ b/tests/python-pytest/onnx/import/mxnet_backend_rep.py
@@ -73,16 +73,26 @@ def run(self, inputs, **kwargs):
         for idx, input_name in enumerate(data_names):
             data_shapes.append((input_name, inputs[idx].shape))
 
-        mod = mx.mod.Module(symbol=self.symbol, data_names=data_names, context=ctx,
-                            label_names=None)
-        mod.bind(for_training=False, data_shapes=data_shapes,
-                 label_shapes=None)
-        mod.set_params(arg_params=self.arg_params, aux_params=self.aux_params)
+        # module bind method requires all data to have same batch size,
+        # using module if all data have same batch size
+        if len(set([data_shape[1][0] for data_shape in data_shapes])) == 1:
+            mod = mx.mod.Module(symbol=self.symbol, data_names=data_names, context=ctx,
+                                label_names=None)
+            mod.bind(for_training=False, data_shapes=data_shapes,
+                     label_shapes=None)
+            mod.set_params(arg_params=self.arg_params, aux_params=self.aux_params)
+
+            # run inference
+            mod.forward(mx.io.DataBatch(data_forward))
+            result = mod.get_outputs()[0].asnumpy()
+            # split operator inference returns 1 less dimension
+            if self.symbol.name.startswith('split'):
+                return [i.asnumpy() for i in mod.get_outputs()]
+            return [result]
+        # using symbol bind method if data have different batch size
+        else:
+            exec1 = self.symbol.bind(ctx, args=dict(zip(data_names, data_forward)))
+            exec1.forward(is_train=False)
+            result = exec1.outputs[0].asnumpy()
+            return [result]
 
-        # run inference
-        mod.forward(mx.io.DataBatch(data_forward))
-        result = mod.get_outputs()[0].asnumpy()
-        # split operator inference returns 1 less dimension
-        if self.symbol.name.startswith('split'):
-            return [i.asnumpy() for i in mod.get_outputs()]
-        return [result]
diff --git a/tests/python-pytest/onnx/import/mxnet_backend_test.py b/tests/python-pytest/onnx/import/mxnet_backend_test.py
index 06ce681907f..d9e4dccae24 100644
--- a/tests/python-pytest/onnx/import/mxnet_backend_test.py
+++ b/tests/python-pytest/onnx/import/mxnet_backend_test.py
@@ -39,12 +39,12 @@
 for op_tests in test_cases.IMPLEMENTED_OPERATORS_TEST:
     BACKEND_TESTS.include(op_tests)
 
-for std_model_test in test_cases.STANDARD_MODEL:
-    BACKEND_TESTS.include(std_model_test)
-
 for basic_model_test in test_cases.BASIC_MODEL_TESTS:
     BACKEND_TESTS.include(basic_model_test)
 
+for std_model_test in test_cases.STANDARD_MODEL:
+    BACKEND_TESTS.include(std_model_test)
+
 BACKEND_TESTS.exclude('.*broadcast.*')
 BACKEND_TESTS.exclude('.*bcast.*')
 
diff --git a/tests/python-pytest/onnx/import/test_cases.py b/tests/python-pytest/onnx/import/test_cases.py
index 3cad3abf69f..fd578221770 100644
--- a/tests/python-pytest/onnx/import/test_cases.py
+++ b/tests/python-pytest/onnx/import/test_cases.py
@@ -51,7 +51,7 @@
     'test_reciprocal',
     'test_sqrt',
     'test_pow',
-    'test_exp',
+    'test_exp_',
     'test_argmax',
     'test_argmin',
     'test_min',
@@ -79,7 +79,8 @@
     'test_averagepool_2d_strides',
     'test_averagepool_3d',
     'test_LpPool_',
-    'test_instancenorm_epsilon',
+    'test_cast',
+    'test_instancenorm',
     #pytorch operator tests
     'test_operator_exp',
     'test_operator_maxpool',


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services