ONNX简介

开放神经网络交换ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软和Facebook于2017推出,然后迅速得到了各大厂商和框架的支持。通过短短几年的发展,已经成为表示深度学习模型的实际标准,并且通过ONNX-ML,可以支持传统非神经网络机器学习模型,大有一统整个AI模型交换标准。

ONNX定义了一组与环境和平台无关的标准格式,为AI模型的互操作性提供了基础,使AI模型可以在不同框架和环境下交互使用。硬件和软件厂商可以基于ONNX标准优化模型性能,让所有兼容ONNX标准的框架受益。目前,ONNX主要关注在模型预测方面(inferring),使用不同框架训练的模型,转化为ONNX格式后,可以很容易的部署在兼容ONNX的运行环境中。

ONNX 版本

转换器可以为特定版本的 ONNX 转换模型。每个 ONNX 版本都标有函数onnx_opset_version返回的 opset 编号。如果在转换模型时未指定参数目标 opset(参数target_opset),则此函数返回该参数的默认值。每个运算符都进行了版本控制。该库为每个操作员选择低于或等于目标 opset 编号的最新版本。ONNX 模型对于每个操作员域都有一个 opset 编号,此值是所有 onnx 节点中的最大 opset 数。

<<<from skl2onnx import __max_supported_opset__
print("Last supported opset:", __max_supported_opset__)
>>>
Last supported opset: 15

ONNX标准介绍

ONNX规范由以下几个部分组成:

  • 一个可扩展的计算图模型:定义了通用的计算图中间表示法(Intermediate Representation)。
  • 内置操作符集:ai.onnxai.onnx.mlai.onnx是默认的操作符集,主要针对神经网络模型,ai.onnx.ml主要适用于传统非神经网络机器学习模型。
  • 标准数据类型。包括张量(tensors)、序列(sequences)和映射(maps)。

目前,ONNX规范有两个官方变体,主要区别在与支持的类型和默认的操作符集。ONNX神经网络变体只使用张量作为输入和输出;而作为支持传统机器学习模型的ONNX-ML,还可以识别序列和映射,ONNX-ML为支持非神经网络算法扩展了ONNX操作符集。

ONNX使用protobuf序列化AI模型,顶层是一个模型(Model)结构,主要由关联的元数据和一个图(Graph)组成;图由元数据、模型参数、输入输出、和计算节点(Node)序列组成,这些节点构成了一个计算无环图,每一个计算节点代表了一次操作符的调用,主要由节点名称、操作符、输入列表、输出列表和属性列表组成,属性列表主要记录了一些运行时常量,比如模型训练时生成的系数值。

为了更直观的了解ONNX格式内容,下面,我们训练一个简单的Logistic Regression模型,然后导出ONNX。仍然使用常用的分类数据集iris

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressioniris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y)clr = LogisticRegression()
clr.fit(X_train, y_train)

使用skl2onnx把Scikit-learn模型序列化为ONNX格式:

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorTypeinitial_type = [('float_input', FloatTensorType([1, 4]))]
onx = convert_sklearn(clr, initial_types=initial_type)
with open("logreg_iris.onnx", "wb") as f:f.write(onx.SerializeToString())

initial_type是模型的输入,维度为1*4.

下面我们使用ONNX Runtime Python API预测该ONNX模型,当前仅使用了测试数据集中的第一条数据:

import onnxruntime as rt
import numpy
sess = rt.InferenceSession("logreg_iris.onnx")
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name
probability_name = sess.get_outputs()[1].name
pred_onx = sess.run([label_name, probability_name], {input_name: X_test[0].astype(numpy.float32)})# print info
print('input_name: ' + input_name)
print('label_name: ' + label_name)
print('probability_name: ' + probability_name)
print(X_test[0])
print(pred_onx)

打印的模型信息和预测值如下:

input_name: float_input
label_name: output_label
probability_name: output_probability
[5.5 2.6 4.4 1.2]
[array([1], dtype=int64), [{0: 0.012208569794893265, 1: 0.5704444646835327, 2: 0.4173469841480255}]]

最新文章

  1. (一)python简单应用
  2. 第十二周项目一-实现复数类中的运算符重载(2)
  3. Kong APIGW — Plugins — Traffic Control
  4. 多种分布式文件系统简介
  5. 佳铁怎样传输程序_阿里资深开发工程师合著《Java开发手册》,影响250万程序员附pdf...
  6. python读取dicom格式的图像并转为png格式
  7. LVM---逻辑盘卷管理
  8. 本机获取Intel AMT IP地址的例子
  9. 调用微信支付接口总结
  10. 源码之前,了无秘密(一)——iterator adapter
  11. 软件测试 白盒测试是否为闰年,对【判断闰年】函数的白盒测试
  12. JDBC通过Mysql驱动包连接数据库
  13. 《疯狂的程序员》有感
  14. 快速搭建一个直播Demo
  15. Linux学习6 脚本登录主机 数组 排序 系统负载查询命令 定期备份
  16. Element概述、入门案例及布局
  17. 实验一:交换机和路由器的基本配置
  18. itest软件测试工具,Monkey测试工具 - iTest99的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  19. 为什么大部分服务器都用Linux系统
  20. 萨缪尔·莫尔斯,一个种族主义画家是如何窃取了电报发明权的呢?

热门文章

  1. 002 免格式化U盘部署PE(BIOS)
  2. SMART硬盘检测参数详解
  3. python提取二值栅格上边界和中线
  4. java图片合成_Java图片处理(一)图片合成
  5. SQL Server“对象名无效”报错的解决方法
  6. 【退役文】人退心不退,博客有空继续更
  7. window系统中hosts文件位置与修改
  8. 渗透测试之通道构建Cheat Sheet
  9. pixel 刷入自己编译的Android 8.0 安装Xposed 显示 Verified Boot (dm-verity) prevents the device from booting
  10. 机器人——人类的终极进化