PaddlePaddle的API文档:
export-API文档-PaddlePaddle深度学习平台

一、环境准备

paddle环境中安装onnx、onnxruntime

 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnxruntime  onnx

二、paddle导出onnx Demo

搭建一个简单多输入分类模型并保存成PaddlePaddle和ONNX格式  。 (PaddleToONNX.py)

import paddle
import paddle.nn as nn

class MyNet(nn.Layer):
    def __init__(self, num_classes=10):
        super(MyNet, self).__init__()
        self.num_classes = num_classes
        self.features_1 = nn.Sequential(
            nn.Conv2D(in_channels=1, out_channels=2,
                      kernel_size=3, stride=1, padding=1),
            nn.ReLU())
        self.features_2 = nn.Sequential(
        nn.Conv2D(in_channels=1, out_channels=2,
                  kernel_size=3, stride=1, padding=1),
        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 z

model = 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(layer=model, path='./pd_model/pdmodel',
                input_spec=[x_spec, y_spec])
paddle.onnx.export(layer=model, path='./model',
                   input_spec=[x_spec, y_spec], opset_version=11)

onnx正确性验证:验证ONNX模型的正确性,会检查模型的版本,图的结构,节点及输入输出。若输出为 Check: None 则表示无报错信息,模型导出正确。(paddlecheck.py)

import onnx

onnx_model = onnx.load("./model.onnx")
check = onnx.checker.check_model(onnx_model)
print('Check: ', check)

一致性检测:检查导出的ONNX模型和原始的PaddlePaddle模型是否有相同的计算结果。(paddleonnx.py)

import numpy as np
import onnxruntime
import paddle

input1 = 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], rtol=1e-03, atol=1e-05)
print("onnx model check finsh.")

ONNX模型后,可以使用开源可视化工具Netron来查看网络结构及相关配置信息。Netron的使用方式主要分为两种,一种是使用在线网页版 Netron ,另一种是下载安装程序 GitHub - lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models 

ir_version和opset_version修改

地平线工具链支持的ONNX模型需要满足 opset_version=10/11 且 ir_version≤7,当拿到的ONNX模型不满足这两个要求时,可以修改代码重新导出,或者尝试编写脚本直接修改ONNX模型的对应属性,第二种方式的示例代码如下。(opset.py)

import onnx

model = onnx.load("./model.onnx")
model.ir_version = 6
model.opset_import[0].version = 10
onnx.save_model(model, "./model_version.onnx")

 

此时ONNX模型的ir_version=6,opset_version=10,满足地平线工具链的转换条件

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐