mxnet转onnx 之 onnx_mxnet.export_model失败原因

在尝试将mxnet模型转换为onnx时遇到错误,起初因onnx版本过高导致转换失败。通过降低onnx版本到1.2.1,并使用python36及visual studio 2017环境,解决了MXNetError。但转换仍报相同错误,问题待解决。

mxnet模型转换onnx折腾了很久,终于搞清楚失败原因

转换代码参考: https://github.com/onnx/tutorials/blob/master/tutorials/MXNetONNXExport.ipynb

 

一开始的环境:

  • windows 10
  • visual studio 2019
  • python37
  • mxnet==1.4.1

pip install onnx 安装的是最新的1.6.0版本 

运行到 “onnx_mxnet.export_model” 这一句代码的时候 提示invalid *** array,然后就不能转换了

mxnet.base.MXNetError: [10:25:05] C:\Jenkins\workspace\mxnet-tag\mxnet\src\ndarray\ndarray.cc:1805: Check failed: fi->Read(data) Invalid NDArray file format

好嘛, 我查资料说是onnx1.2.1版本可以转换成功,(也有说1.2.2,1.3.0都可以的) pip install onnx==1.2.1竟然失败

好,我源码安装,参考https://github.com/onnx/onnx/readme.md 一样失败 源码折腾了近两天啊

 

要疯了

 

终于找到资料这么说的:

Hi thanks for reporting this. It look

MXNetONNX模型换等方面有紧密联系。在MXNetONNX时,可使用`onnx_mxnet.export_model`函数实现换。示例代码如下,该代码将MXNet模型换为ONNX格式: ```python import mxnet as mx import numpy as np import sys import os import argparse import onnx print('mxnet version:', mx.__version__) print('onnx version:', onnx.__version__) from mxnet.contrib import onnx as onnx_mxnet from onnx import checker syms = './mnist-symbol.json' params = './mnist-0000.params' input_shape = (1,3,112,112) onnx_file = './mnist.onnx' # Invoke export model API. It returns path of the converted onnx model converted_model_path = onnx_mxnet.export_model(syms, params, [input_shape], np.float32, onnx_file) # Load onnx model model_proto = onnx.load_model(converted_model_path) # Check if converted ONNX protobuf is valid checker.check_graph(model_proto.graph) ``` 不过在换过程中可能会遇到问题,如出现`mxnet.base.MXNetError: [10:25:05] C:\Jenkins\workspace\mxnet-tag\mxnet\src\ndarray\ndarray.cc:1805: Check failed: fi->Read(data) Invalid NDArray file format`错误 [^1][^2]。 此外,在MXNetONNX的过程中还存在一些其他的问题,例如ONNX实现的softmax在处理多维输入(NCHW)存在问题。可以通过自定义换函数来解决,示例代码如下: ```python @mx_op.register("softmax") def convert_softmax(node, **kwargs): """Map MXNet's softmax operator attributes to onnx's Softmax operator and return the created node. """ name, input_nodes, attrs = get_inputs(node, kwargs) axis = int(attrs.get("axis", -1)) c_softmax_node = [] axis=-1 transpose_node1 = onnx.helper.make_node( "Transpose", inputs=input_nodes, perm=(0,2,3,1), #NCHW--NHWC--(NHW,C) name=name+'_tr1', outputs=[name+'_tr1'] ) softmax_node = onnx.helper.make_node( "Softmax", inputs=[name+'_tr1'], axis=axis, name=name+'', outputs=[name+''] ) transpose_node2 = onnx.helper.make_node( "Transpose", inputs=[name+''], perm=(0,3,1,2), #NHWC--NCHW name=name+'_tr2', outputs=[name+'_tr2'] ) c_softmax_node.append(transpose_node1) c_softmax_node.append(softmax_node) c_softmax_node.append(transpose_node2) return c_softmax_node ``` 该函数将MXNet的softmax操作符属性映射到ONNX的Softmax操作符并创建相应的节点 [^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值