将机器学习模型转换为onnx

onnxmltools的Python项目详细描述


LinuxWindows
Build StatusBuild Status

简介

onnxmltools允许您将不同机器学习工具包中的模型转换为ONNX。目前支持以下工具包:

  • 苹果核ml
  • SCIKIT学习(可转换为OnNX的车型子集)
  • 路缘石
  • 火花ml(实验性)
  • lightgbm
  • libsvm
  • xgboost

要将tensorflow模型转换为onnx,请参见tensorflow-onnx

安装

您可以从PyPi

安装最新版本的onnxmltools
pip install onnxmltools

或从源安装:

pip install git+https://github.com/onnx/onnxmltools

如果选择从源代码安装onnxmltools,则必须在安装onnx包之前设置环境变量ONNX_ML=1

依赖关系

这个包依赖于nx、numpy和protobuf。如果要从scikit learn、core ml、keras、lightgbm、sparkml、xgboost或libsvm转换模型,则需要一个安装了下面列表中相应软件包的环境:

  1. SCIKIT学习
  2. 核心工具
  3. Keras(2.0.8版或更高版本)具有相应的TensorFlow版本
  4. LightGBM(SCIKIT学习界面)
  5. SPARKML
  6. XGBoost(SCIKIT学习界面)
  7. libsvm

onnxmltools已经用python2.73.53.63.7进行了测试。

示例

如果希望转换后的onnx模型与某个onnx版本兼容,请在调用转换函数时指定target_opset参数。下面的Keras模型转换示例演示了这一点。您可以在versioning documentation中标识从onnx操作集(称为操作集)到onnx发行版的映射。

coreml到onnx转换

下面是一个简单的代码片段,用于将核心ml模型转换为onnx模型。

importonnxmltoolsimportcoremltools# Load a Core ML modelcoreml_model=coremltools.utils.load_spec('example.mlmodel')# Convert the Core ML model into ONNXonnx_model=onnxmltools.convert_coreml(coreml_model,'Example Model')# Save as protobufonnxmltools.utils.save_model(onnx_model,'example.onnx')

路缘石到onnx的转换

接下来,我们将展示一个使用target_opset=7将keras模型转换为onnx模型的示例,该模型对应于onnx版本1.2。

importonnxmltoolsfromkeras.layersimportInput,Dense,Addfromkeras.modelsimportModel# N: batch size, C: sub-model input dimension, D: final model's input dimensionN,C,D=2,3,3# Define a sub-model, it will become a part of our final modelsub_input1=Input(shape=(C,))sub_mapped1=Dense(D)(sub_input1)sub_model1=Model(inputs=sub_input1,outputs=sub_mapped1)# Define another sub-model, it will become a part of our final modelsub_input2=Input(shape=(C,))sub_mapped2=Dense(D)(sub_input2)sub_model2=Model(inputs=sub_input2,outputs=sub_mapped2)# Define a model built upon the previous two sub-modelsinput1=Input(shape=(D,))input2=Input(shape=(D,))mapped1_2=sub_model1(input1)mapped2_2=sub_model2(input2)sub_sum=Add()([mapped1_2,mapped2_2])keras_model=Model(inputs=[input1,input2],output=sub_sum)# Convert it! The target_opset parameter is optional.onnx_model=onnxmltools.convert_keras(keras_model,target_opset=7)

Spark ML到OnNX转换

请参阅以下文档:

测试模型转换器

onnxmltools将模型转换为onnx格式 然后可用于计算预测 你选择的后端。

检查已转换的onnx型号的操作员设置版本

您可以使用Netron(神经网络模型的查看器)检查转换后的onnx模型的运算符集。或者,您可以通过下面的代码行标识转换模型的操作集版本。

opset_version = onnx_model.opset_import[0].version

如果检查onnx模型的操作集的结果小于在onnxmltools.convert函数中指定的target_opset数字,请确保这可能是预期行为。onnxmltools转换器的工作原理是将每个运算符分别转换为onnx格式,并查找其最近更新的相应操作集版本。一旦所有的操作符被转换,得到的ONNX模型都具有其所有运算符的最大opSET版本。

为了具体说明这一点,让我们考虑一个有两个操作符的模型,abs和add。截至2018年12月,Abs在opset 6中最近更新,而Add在opset 7中最近更新。因此,转换后的onnx模型的操作集将始终为7,即使您请求target_opset=8。这样定义转换器行为是为了确保向后兼容。

ONNX tutorials存储库中可以找到ONNX Model format的文档,以及从不同框架转换模型的更多示例。

对所有现有变流器

进行测试 存在一种方式 自动检查每个转换器 onnxruntimeonnxruntime-gpu。 此过程要求用户克隆onnxmltools存储库。 运行以下命令所有单元测试和生成 模型、输入、预期输出和转换模型的转储 在文件夹TESTDUMP中。

python tests/main.py DUMP

对于大多数模型,它需要onnxruntimenumpypandas用于与文本功能相关的转换,以及 scipy用于稀疏特征。一个测试还需要 keras测试自定义运算符。那意味着 sklearn或请求任何机器学习库。

添加新的转换器

一旦转换器实现,就添加了单元测试 以确认它有效。在单元测试结束时,函数 dump_data_and_model或任何等效函数都必须调用 以转储预期输出和转换的模型。 生成这些文件后,相应的测试必须 添加到tests_backend中以计算预测 在运行时。

许可证

MIT License

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何修复尝试将用户签名到服务器主机时出现的“字符串无法转换为json对象”错误?   控制台Java:不使用新行更新命令行中的文本   java servlet接收xml数据时,出现错误   使用REST API在Bitbucket中复制或复制存储库   java如何在JavaFX中对齐一行?   java如何在活动中显示通过服务获得的数据?   返回BigDecimal作为字符串:返回int   java组织。openqa。硒。InvalidSelectorException:尝试查找元素时选择器无效   java仅在阻塞状态下通知和通知所有影响线程   java JBOSS无法启动部署   java方法的返回值能保证类型安全吗?   JavaeShadoop序列化组织。阿帕奇。hadoop。木卫一。短写失败   java如果我在同一个类上同步了两个方法,它们能同时运行吗?   不使用java数据库的spring分页实现   java如何将字符串切碎成这样的数组?