onnx作为一个通用格式,很少有中文教程,因此开一篇文章对onnx 1.16文档进行翻译与进一步解释,
onnx 1.16官方文档:https://onnx.ai/onnx/intro/index.html](https://onnx.ai/onnx/intro/index.html),
如果觉得有收获,麻烦点赞收藏关注,目前仅在CSDN发布,本博客会分为多个章节,目前尚在连载中,详见专栏链接:
https://blog.csdn.net/qq_33345365/category_12581965.html
开始编辑时间:2024/2/21;最后编辑时间:2024/2/21
这是本教程的第四篇,其余内容见上述专栏链接。
ONNX with Python
本教程的第一篇:介绍了ONNX的基本概念。
在本教程的第二篇,介绍了ONNX关于Python的API,具体涉及一个简单的线性回归例子和序列化。
本教程的第三篇,包括python API的三个部分:初始化器Initializer;属性Attributes;算子集和元数据Opset和Metadata
本教程的第四篇,包括子图的两个内容,使用If和Scan算子实现子图的选择和循环。
在本篇中,会介绍以下内容:
- 函数
- 不带属性的函数
- 带有属性的函数
- 模型解析:onnx提供了一种简单定义图的方式,可以实现快速构图,并不常用。
- 检查器与形状推理 checker and shape inference
- 检查器:检查模型是否有效
- 形状推理:估计中间结果的形状和种类
函数
正如前一章所述,函数可以用来缩短构建模型的代码,并为运行时预测提供更多可能性,如果存在特定函数实现,可以使其运行更快。如果没有特定实现,运行时仍然可以基于现有算子使用默认实现。
make_function
函数用于定义一个函数。它就像一个简化类型的图,更像是一个模板。这个 API 可能会有所演变,它也不包含初始化器。
没有属性的函数
这是更简单的情况,函数的每个输入都是在执行时已知的动态对象。
import numpy
from onnx import numpy_helper, TensorProto
from onnx.helper import (
make_model, make_node, set_model_props, make_tensor,
make_graph, make_tensor_value_info, make_opsetid,
make_function)
from onnx.checker import check_model
new_domain = 'custom'
opset_imports = [make_opsetid("", 14), make_opsetid(new_domain, 1)]
# 定义一个线程回归的函数
node1 = make_node('MatMul', ['X', 'A'], ['XA'])
node2 = make_node('Add', ['XA', 'B'], ['Y'])
linear_regression = make_function(
new_domain, # domain name
'LinearRegression', # function name
['X', 'A', 'B'], # input names
['Y'], # output names
[node1, node2], # nodes
opset_imports, # opsets
[]) # attribute names
# 在没有变量前,函数是可以构建的
X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
A = make_tensor_value_info('A', TensorProto