专栏算法工具链通过onnx组件编辑调整onnx模型

通过onnx组件编辑调整onnx模型

Huanghui2024-01-30
92
0

1. ONNX介绍

ONNX是一种文件格式,其针对机器学习所设计的,用于存储训练好的模型。他是开放式的,所有的深度学习框架都可以自由使用,这使得不同的深度学习框架(如Pytorch, MXNet)可以采用相同格式存储模型数据。简而言之,ONNX是一种便于在各个主流深度学习框架中迁移模型的中间表达格式

2. ONNX构成(底层实现

ONNX 在底层是用 Protobuf 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件(以.proto为文件名后缀),然后根据业务需要通过google提供的转换工具将数据定义文件转换成用不同语言实现的接口代码,然后使用接口把结构化数据存储进一份二进制文件中或从文件中使用接口将数据读出为结构化数据。可以说,数据定义文件就是数据类,二进制文件就是数据类的实例。

一个 Protobuf 数据定义文件的例子如下:

这段定义了 Person 这种数据类型,其中 name、id 两个字段为必须包含项,email字段选择性包含项。根据这份定义文件,用户就可以选择一种编程语言,定义一个含有成员变量 name、id、email 的 Person 类,然后把这个类的某个实例用 Protobuf 存储成二进制文件;反之,用户也可以用二进制文件和对应的数据定义文件,读取出一个 Person 类的实例。

而对于 ONNX ,Protobuf 的数据定义文件在其开源库中,这些文件定义了神经网络中模型、节点、张量的数据类型规范;而二进制文件就是我们熟悉的“.onnx"文件,每一个 onnx 文件按照数据定义规范,存储了一个神经网络的所有相关数据。ONNX 模型的结构可以用类图大致表示如下:

下面这个文章详细介绍了onnx的文件构成:

https://blog.csdn.net/Rolandxxx/article/details/127713806

3.ONNX编辑调整工具

直接用 Protobuf 生成 ONNX 模型还是比较麻烦的。幸运的是,ONNX 提供了很多实用 API,我们可以在完全不了解 Protobuf 的前提下,构造、读取及修改 ONNX 模型。python端使用onnx工具对onnx模型进行调整,可通过下载代码载入调整工具:

通过onnx.helper来操作onnx时常用的API包括:

  • 操作node列表项

  • 通过onnx.helper.make_node生成多个算子节点

  • 操作initializer列表项

  • 通过onnx.helper.make_tensor对算子节点进行初始化

  • 操作input和output列表项

  • 通过onnx.helper.make_value_info生成输入输出

  • 操作graph(计算)

  • 以node列表、input/output/initializer列表项为参数,通过onnx.helper.make_graph接口生成计算图

  • 操作model(模型)

  • 通过onnx.helper.make_model

使用onnx.helper的make_tensor、make_tensor_value_info、make_attribute、make_node,make_graph,make_node等一系列make方法来完整构建了一个ONNX模型。


节点操作时设计到的算子名称和参数信息可以参考

https://github.com/onnx/onnx/blob/main/docs/Operators.md


以下示例包含了通过onnx.helper来构建计算图的示例:

https://blog.csdn.net/qq_42178122/article/details/127604762

以下示例包含了通过onnx.helper来构建计算图的示例和注意事项

https://blog.csdn.net/qq_39967751/article/details/124989296

4. 常规调整及示例

4.1 节点操作


暂时无法在飞书文档外展示此内容

暂时无法在飞书文档外展示此内容

原始tanway.onnx中3个输入类型中工具链不支持int32的输入:

修改后的模型tanway_test.onnx编译成功:


4.2 版本转换


  • 使用version_converter

5. 其他关于onnx调整的文档

算法工具链
征程3征程5杂谈
评论0
0/1000