MxNet模型转换Onnx

MxNet模型导出ONNX模型
Open Neural Network Exchange (ONNX)为AI模型提供了一种开源的数据模型格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。它可以作为各种AI模型之间进行转换的媒介,例如,市面上没有现成的Caffe模型到MxNet模型的转换工具,我们可以借助于ONNX,首先将Caffe转换为Onnx,然后再将Onnx转换为MxNet,更为神奇的是,这之间的转换过程不过丢失原有模型的精度。

在本教程中,我们将展示如何将MXNet模型保存为ONNX格式。MXNet-ONNX操作符的覆盖范围和特性定期更新。请访问 ONNX operator coverage以获取最新信息。在本教程中,我们将学习如何使用MXNet到ONNX的模型导出工具对预先训练的模型进行导出。

预备知识
要运行本教程,你需要安装以下python模块:

MXNet >= 1.3.0。注意,经测试使用下面的命令进行安装MXNET可用:PIP INSTALL MXNET==1.4.0 --USER

onnx。注意,经测试使用如下命令进行安装onnx可用:pip install onnx==1.2.1 --user

**注意:**MXNet-ONNX导入、导出工具遵循ONNX操作符集的第7版,该操作符集附带ONNX v1.2.1。

import mxnet as mx
import numpy as np
from mxnet.contrib import onnx as onnx_mxnet
import logging
logging.basicConfig(level=logging.INFO)

从MXNet Model Zoo下载一个模型
我们从MXNet Model Zoo.下载预训练的ResNet-18 ImageNet 模型。我们还将下载synset文件来匹配标签

# Download pre-trained resnet model - json and params by running following code.
path=‘http://data.mxnet.io/models/imagenet/‘
[mx.test_utils.download(path+‘resnet/18-layers/resnet-18-0000.params‘),
mx.test_utils.download(path+‘resnet/18-layers/resnet-18-symbol.json‘),
mx.test_utils.download(path+‘synset.txt‘)]

现在,我们已经在磁盘上下载了ResNet-18、params和synset文件。

MXNet到ONNX导出器API
让我们来描述MXNet的’ export_model ’ API。

help(onnx_mxnet.export_model)

Help on function export_model in module mxnet.contrib.onnx.mx2onnx.export_model:

export_model(sym, params, input_shape, input_type=<type ‘numpy.float32‘>, onnx_file_path=u‘model.onnx‘, verbose=False)
Exports the MXNet model file, passed as a parameter, into ONNX model.
Accepts both symbol,parameter objects as well as json and params filepaths as input.
Operator support and coverage - https://cwiki.apache.org/confluence/display/MXNET/MXNet-ONNX+Integration

Parameters
----------
sym : str or symbol object
Path to the json file or Symbol object
params : str or symbol object
Path to the params file or params dictionary. (Including both arg_params and aux_params)
input_shape : List of tuple
Input shape of the model e.g [(1,3,224,224)]
input_type : data type
Input data type e.g. np.float32
onnx_file_path : str
Path where to save the generated onnx file
verbose : Boolean
If true will print logs of the model conversion

Returns
-------
onnx_file_path : str
Onnx file path

’ export_model ’ API可以通过以下两种方式之一接受MXNet模型。

MXNet sym, params对象:
如果我们正在训练一个模型,这是有用的。在训练结束时,我们只需要调用’ export_model ‘函数,并提供sym和params对象作为输入和其他属性,以将模型保存为ONNX格式。
MXNet导出的json和params文件:
如果我们有预先训练过的模型,并且希望将它们转换为ONNX格式,那么这是非常有用的。
由于我们已经下载了预训练的模型文件,我们将通过传递符号和params文件的路径来使用’ export_model ’ API。

如何使用MXNet到ONNXA导入、导出工具PI
我们将使用下载的预训练的模型文件(sym、params)并定义输入变量。

# 下载的输入符号和参数文件
sym = ‘./resnet-18-symbol.json‘
params = ‘./resnet-18-0000.params‘

# 标准Imagenet输入- 3通道,224*224
input_shape = (1,3,224,224)

# 输出文件的路径
onnx_file = ‘./mxnet_exported_resnet50.onnx‘

我们已经定义了’ export_model ’ API所需的输入参数。现在,我们准备将MXNet模型转换为ONNX格式

# 调用导出模型API。它返回转换后的onnx模型的路径
converted_model_path = onnx_mxnet.export_model(sym, params, [input_shape], np.float32, onnx_file)

这个API返回转换后的模型的路径,您稍后可以使用该路径将模型导入其他框架。

检验ONNX模型的有效性
现在我们可以使用ONNX检查工具来检查转换后的ONNX模型的有效性。该工具将通过检查内容是否包含有效的protobuf来验证模型:

from onnx import checker
import onnx

# Load onnx model
model_proto = onnx.load_model(converted_model_path)

# Check if converted ONNX protobuf is valid
checker.check_graph(model_proto.graph)

如果转换后的protobuf格式不符合ONNX proto规范,检查器将抛出错误,但在本例中成功通过。

该方法验证了导出模型原buf的有效性。现在,模型可以导入到其他框架中进行推理了!

原文地址:https://www.cnblogs.com/cloudrivers/p/12129606.html

时间: 2024-08-30 18:18:01

MxNet模型转换Onnx的相关文章

Mxnet模型转换ONNX,再用tensorrt执行前向运算

环境:ubuntu16.04 tensorrt版本:5.1.5.0 cuda版本:9.0 GPU:1080Ti Mxnet版本:1.3.1 cudnn:7.3.1 1.tensorrt安装: https://github.com/NVIDIA/TensorRT tensorrt的不同版本: https://developer.nvidia.com/nvidia-tensorrt-download tensorrt python版的安装参考: https://blog.csdn.net/zong5

OpenVino的MXnet模型转换

[在使用Movidius的模型优化器转换模型之前,需要先用MXNet的deploy.py将模型转换成部署模式,然后才能用movidius的优化器转换] https://github.com/apache/incubator-mxnet/blob/master/example/ssd/deploy.py cd ~git clone https://github.com/apache/incubator-mxnet mv tmp/*-0000.params tmp/ssd_resnet50_512-

MxNet 模型转Tensorflow pb模型

用mmdnn实现模型转换 参考链接:https://www.twblogs.net/a/5ca4cadbbd9eee5b1a0713af 安装mmdnn pip install mmdnn 准备好mxnet模型的.json文件和.params文件, 以InsightFace MxNet r50为例        https://github.com/deepinsight/insightface 用mmdnn运行命令行 python -m mmdnn.conversion._script.con

数据库设计之E-R模型转换成关系模型

个人重构版机房收费系统中需要自己重新设计数据库,那么如何设计数据库呢?这也是咱们自考中一门重要的课程<数据库原理>,对于考过这科的同学想必已经从中受益,直接就可以学以致用.我是今年10月份考这本书,所以就先实践一把. 原先看过的耿建玲老师的视频,里面重点讲解的是数据库内部的具体操作,没有怎么涉及到数据库设计中不可或缺的一个步骤即从概念模型到逻辑模型的转换.进入正题: 背景:数据系统生存期 我们把数据库应用系统从开始规划.设计.实现.维护到最后被新的系统取代而停止使用的整个期间,称为数据库系统生

[CodeForces-606E] Freelancer&#39;s Dreams 凸包 模型转换

大致题意: 有一个人想要获得p个经验点和q元钱.现在给出n份工作,每份工作每天能得到Ai的经验值和Bi的钱,问最少需要工作多少天, 能使得总经验值>=p,总钱>=q. 先对给出的n份工作以及原点O(0,0),x轴的最大点(maxx,0),y轴最大点(0,maxy)构建凸包,根据凸组合,可知凸包上所有得点以 及凸包边上的点都可以由一天时间得到,那么只要求出射线O~P(p,q)与凸包的交点,即可求出最后的结果. 1 #include<cstdio> 2 #include<iost

动态规划(模型转换):uvaoj 1625 Color Length

[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=5010; 6 char s1[maxn],s2[maxn]; 7 int B1[26],E1[

Flutter JSON解析与复杂模型转换技巧

其实转换成model类是有好处的,转换后可以减少上线后APP崩溃和出现异常,所以我们从这节课开始,要制作model类模型,然后用model的形式编辑UI界面. 类别json的分析 比如现在从后台得到了一串JSON数据: { "code": "0", "message": "success", "data": [{ "mallCategoryId": "4", &quo

iOS开发小技巧--利用MJExtension解决数据结构复杂的模型转换

一.开发中难免会遇到,系统返回的数据中字典套集合,集合里面又套一层字典,然后字典里面还有字典或者集合等等的复杂结构的数据...MJExtension轻松搞定这类问题 1.解决方法一: 例:百思项目中帖子数据有个模型,模型中还有一个最热评论的集合数据,集合数据要求是ChaosComment模型数据,然后ChaosComment模型中还有一个user字典(ChaosUser模型),如图: 解决方案:利用MJExtension,实现mj_objectClassInArray方法,告诉模型中的这个集合属

学习IOS开发UI篇--MVC设计界面及数据的模型转换

1.字典转模型 ======================================== 1.1字典转模型的好处: 1> 降低代码的耦合度 2> 所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率 3> 在程序中直接使用模型的属性操作,提高编码效率 模型应该提供一个可以传入字典参数的构造方法 - (instancetype)initWithDict:(NSDictionary *)dict; + (instancetype)xxxWithDict:(NSDiction