Paddle 转 ONNX 示例
概述
本示例展示百度 PaddlePaddle 模型如何转化为 ONNX 格式,从而适配 Netrans 工具。以 LeNet 手写数字识别模型作为示例,通过 paddle2onnx 工具可以直接将 PaddlePaddle 模型转化为 ONNX 格式,也可以通过 paddle.onnx.export 函数将训练好的模型直接保存为 ONNX 格式。
模型类型:LeNet 手写数字识别模型
转换流程
环境搭建
1mamba create -n conversion python==3.10
2mamba activate conversion
3python -m pip install paddle2onnx
4pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
使用命令行转换 PaddlePaddle 模型
Paddle2ONNX 在导出模型时,需要传入部署模型格式,包括两个文件:
model_name.json:表示模型结构model_name.pdiparams:表示模型参数
基本命令
1paddle2onnx --model_dir model_dir \
2 --model_filename model.json \
3 --params_filename model.pdiparams \
4 --save_file model.onnx
参数说明
参数 |
说明 |
|---|---|
|
配置包含 Paddle 模型的目录路径 |
|
[可选] 配置位于 |
|
[可选] 配置位于 |
|
指定转换后的模型保存目录路径 |
|
[可选] 配置转换为 ONNX 的 Opset 版本,支持 7~19,默认为 9 |
|
[可选] 是否开启 opset 版本自动升级功能,默认 True |
|
[可选] 是否检查导出的 ONNX 模型的正确性,建议打开,默认 True |
|
[可选] 是否开启组合算子拆解,默认 False |
|
[可选] ONNX 模型优化工具,可选 onnxoptimizer、polygraphy、None,默认 onnxoptimizer |
|
[可选] 是否打印更详细的日志信息,默认 False |
|
[可选] 查看 paddle2onnx 版本 |
LeNet-MNIST 模型转换示例
步骤 1:下载 Paddle 下的 LeNet 权重
步骤 2:命令行转换
执行完成后会在 paddleOCRdemo 目录下生成对应的 ONNX 文件:
1git clone http://git.aistudio.baidu.com/2973232/paddleOCRdemo.git
2paddle2onnx --model_dir paddleOCRdemo \
3 --model_filename lenet_mnist.pdmodel \
4 --params_filename lenet_mnist.pdiparams \
5 --save_file ./paddleOCRdemo/lenet_mnist.onnx \
6 --opset_version 13 \
7 --enable_onnx_checker True
paddle.onnx.export 接口使用
使用 Paddle 完成模型训练后,调用 paddle.onnx.export 接口即可在指定路径下生成 ONNX 模型。
import paddle
from paddle.vision.transforms import Normalize
transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
# 下载数据集并初始化 DataSet
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
# 模型组网并初始化网络
lenet = paddle.vision.models.LeNet(num_classes=10)
model = paddle.Model(lenet)
# 模型训练的配置准备,准备损失函数、优化器和评价指标
model.prepare(
paddle.optimizer.Adam(parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy()
)
# 模型训练
model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)
# 模型评估
model.evaluate(test_dataset, batch_size=64, verbose=1)
# 导出 ONNX
save_path = 'onnx_save/lenet_mnist' # 保存路径
x_spec = paddle.static.InputSpec([None, 1, 28, 28], 'float32', 'x') # 输入形状和数据类型
paddle.onnx.export(lenet, save_path, input_spec=[x_spec], opset_version=13)
作者:ougaoliang