将机器学习模型转换为onnx
onnxmltools的Python项目详细描述
Linux | Windows |
---|---|
简介
onnxmltools允许您将不同机器学习工具包中的模型转换为ONNX。目前支持以下工具包:
- 苹果核ml
- SCIKIT学习(可转换为OnNX的车型子集)
- 路缘石
- 火花ml(实验性)
- lightgbm
- libsvm
- xgboost
要将tensorflow模型转换为onnx,请参见tensorflow-onnx。
安装
您可以从PyPi:
安装最新版本的onnxmltoolspip 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转换模型,则需要一个安装了下面列表中相应软件包的环境:
- SCIKIT学习
- 核心工具
- Keras(2.0.8版或更高版本)具有相应的TensorFlow版本
- LightGBM(SCIKIT学习界面)
- SPARKML
- XGBoost(SCIKIT学习界面)
- libsvm
onnxmltools
已经用python2.7、3.5、3.6和3.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的文档,以及从不同框架转换模型的更多示例。
对所有现有变流器
进行测试 存在一种方式 自动检查每个转换器 onnxruntime或 onnxruntime-gpu。 此过程要求用户克隆onnxmltools存储库。 运行以下命令所有单元测试和生成 模型、输入、预期输出和转换模型的转储 在文件夹TESTDUMP
中。python tests/main.py DUMP
对于大多数模型,它需要onnxruntime,numpy, pandas用于与文本功能相关的转换,以及 scipy用于稀疏特征。一个测试还需要 keras测试自定义运算符。那意味着 sklearn或请求任何机器学习库。
添加新的转换器
一旦转换器实现,就添加了单元测试 以确认它有效。在单元测试结束时,函数 dump_data_and_model或任何等效函数都必须调用 以转储预期输出和转换的模型。 生成这些文件后,相应的测试必须 添加到tests_backend中以计算预测 在运行时。