paddlepaddle导出onnx
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,满足地平线工具链的转换条件
更多推荐
所有评论(0)