做电影网站如何赚钱,兼容模式网站错位,重庆网站建设狐灵,饰品网站建设文章目录1 背景介绍2 实验环境3 paddle.onnx.export函数简介4 代码实操4.1 PaddlePaddle与ONNX模型导出4.2 ONNX正确性验证4.3 PaddlePaddle与ONNX的一致性检查4.4 多输入的情况5 ONNX模型可视化6 ir_version和opset_version修改7 致谢原文来自于地平线开发者社区#xff0c;未…
文章目录1 背景介绍2 实验环境3 paddle.onnx.export函数简介4 代码实操4.1 PaddlePaddle与ONNX模型导出4.2 ONNX正确性验证4.3 PaddlePaddle与ONNX的一致性检查4.4 多输入的情况5 ONNX模型可视化6 ir_version和opset_version修改7 致谢原文来自于地平线开发者社区未来会持续发布深度学习、板端部署的相关优质文章与视频如果文章对您有帮助麻烦给点个赞如果您有兴趣一起学习欢迎点个关注寻找永不遗憾(CSDN用户名) 1 背景介绍
使用深度学习开源框架Pytorch训练完网络模型后在部署之前通常需要进行格式转换地平线工具链模型转换目前支持Caffe1.0和ONNX(opset_version10/11 且 ir_version≤7)两种。ONNX(Open Neural Network Exchange)格式是一种常用的开源神经网络格式被较多推理引擎支持例如Pytorch、PaddlePaddle、TensorFlow等。本文将详细介绍如何将PaddlePaddle格式的模型导出到ONNX格式。
2 实验环境
本教程的实验环境如下
Python库Versionpaddlepaddle2.4.1paddle2onnx1.0.5onnx1.13.0onnxruntime1.14.0
3 paddle.onnx.export函数简介
paddle.onnx.export函数可以将PaddlePaddle模型导出为ONNX模型函数介绍如下其中x_spec用于配置paddle.onnx.export的input_spec参数。
x_spec paddle.static.InputSpec(shapeNone, dtypefloat32, nameNone)
#shape: 声明维度信息默认为 None
#dtype: 数据类型默认为 float32
#name: 网络输入节点名称paddle.onnx.export(layer, path, input_spec[x_spec], opset_version11, **configs)
#layer: 导出的Layer对象即需要转换的网络模型
#path: 存储模型的路径前缀导出后会自动添加后缀“.onnx”
#input_spec: 用于配置模型输入属性
#opset_version: 默认为9请手动配置10或11关于paddle.onnx.export的更多详细介绍可以查阅PaddlePaddle的API文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html
4 代码实操
4.1 PaddlePaddle与ONNX模型导出
以下代码展示了搭建一个简单分类模型并以PaddlePaddle和ONNX格式保存的过程。
import paddle
import paddle.nn as nnclass MyNet(nn.Layer):def __init__(self, num_classes10):super(MyNet, self).__init__()self.num_classes num_classesself.features nn.Sequential(nn.Conv2D(in_channels1, out_channels2,kernel_size3, stride1, padding1),nn.ReLU())self.linear nn.Sequential(nn.Linear(98, num_classes))def forward(self, inputs):x self.features(inputs)x paddle.flatten(x, 1)x self.linear(x)return xmodel MyNet()#准备输入数据
x_spec paddle.static.InputSpec([1, 1, 7, 7], float32, input1)
#将模型以PaddlePaddle的格式保存以验证和ONNX模型推理的一致性
paddle.jit.save(layermodel, path./pd_model/pdmodel,input_spec[x_spec])
#将模型导出为ONNX格式保存
paddle.onnx.export(layermodel, path./model,input_spec[x_spec], opset_version11)4.2 ONNX正确性验证
可以用以下代码验证ONNX模型的正确性会检查模型的版本图的结构节点及输入输出。若输出为 Check: None 则表示无报错信息模型导出正确。
import onnxonnx_model onnx.load(./model.onnx)
check onnx.checker.check_model(onnx_model)
print(Check: , check)4.3 PaddlePaddle与ONNX的一致性检查
可以使用以下代码检查导出的ONNX模型和原始的PaddlePaddle模型是否有相同的计算结果。
import numpy as np
import onnxruntime
import paddleinput1 np.random.random((1, 1, 7, 7)).astype(float32)ort_sess onnxruntime.InferenceSession(./model.onnx)
ort_inputs {ort_sess.get_inputs()[0].name: input1}
ort_outs ort_sess.run(None, ort_inputs)model paddle.jit.load(./pd_model/pdmodel)
model.eval()
paddle_input paddle.to_tensor(input1)
paddle_outs model(paddle_input)print(ort_outs[0])
print(paddle_outs.numpy())
np.testing.assert_allclose(tf_outs.numpy(), ort_outs[0], rtol1e-03, atol1e-05)
print(onnx model check finsh.)4.4 多输入的情况
若您的模型存在多输入则可参考下方代码保存成PaddlePaddle和ONNX格式。ONNX的正确性验证和PaddlePaddle与ONNX的一致性检查不再赘述仿照上述代码编写即可。
import paddle
import paddle.nn as nnclass MyNet(nn.Layer):def __init__(self, num_classes10):super(MyNet, self).__init__()self.num_classes num_classesself.features_1 nn.Sequential(nn.Conv2D(in_channels1, out_channels2,kernel_size3, stride1, padding1),nn.ReLU())self.features_2 nn.Sequential(nn.Conv2D(in_channels1, out_channels2,kernel_size3, stride1, padding1),nn.ReLU())self.linear nn.Sequential(nn.Linear(98, num_classes))def forward(self, inputs1, inputs2):x self.features_1(inputs1)y self.features_2(inputs2)z paddle.concat((x, y), 1)z paddle.flatten(z, 1)z self.linear(z)return zmodel MyNet()x_spec paddle.static.InputSpec([1, 1, 7, 7], float32, input1)
y_spec paddle.static.InputSpec([1, 1, 7, 7], float32, input2)
paddle.jit.save(layermodel, path./pd_model/pdmodel,input_spec[x_spec, y_spec])
paddle.onnx.export(layermodel, path./model,input_spec[x_spec, y_spec], opset_version11)5 ONNX模型可视化
导出成ONNX模型后可以使用开源可视化工具Netron来查看网络结构及相关配置信息。Netron的使用方式主要分为两种一种是使用在线网页版 https://netron.app/ 另一种是下载安装程序 https://github.com/lutzroeder/netron 。此教程中模型的可视化效果为 6 ir_version和opset_version修改
地平线工具链支持的ONNX模型需要满足 opset_version10/11 且 ir_version≤7当拿到的ONNX模型不满足这两个要求时可以修改代码重新导出或者尝试编写脚本直接修改ONNX模型的对应属性第二种方式的示例代码如下
import onnxmodel onnx.load(./model.onnx)
model.ir_version 6
model.opset_import[0].version 10
onnx.save_model(model, ./model_version.onnx)**注意**高版本向低版本切换时可能会出现问题这里只是一种可尝试的解决方案。 调整结束后使用Netron可视化model_version.onnx如下图所示
此时ONNX模型的ir_version6opset_version10满足地平线工具链的转换条件。
7 致谢
原文来自于地平线开发者社区未来会持续发布深度学习、板端部署的相关优质文章与视频如果文章对您有帮助麻烦给点个赞如果您有兴趣一起学习欢迎点个关注寻找永不遗憾(CSDN用户名)