如何将Paddle(Lite)模型转换为TensorFlow(Lite)模型

本文介绍了如何将PaddlePaddle模型转换为ONNX格式,然后转为TensorFlow模型,最后转换为TensorFlow Lite模型,以适应移动端推理。详细步骤包括环境准备、Paddle到ONNX、ONNX到TensorFlow以及TensorFlow到TensorFlow Lite的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型间的相互转换在深度学习应用中很常见,paddlelite和TensorFlowLite是移动端常用的推理框架,有时候需要将模型在两者之间做转换,本文将对转换方法做说明。

环境准备

建议使用TensorFlow2.14,PaddlePaddle 2.6

docker pull tensorflow/tensorflow:2.14.0

Step1:From Paddle to ONNX

直接参考https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/docs/zh/compile.md 源码编译Paddle2ONNX
然后执行

paddle2onnx --model_dir . --model_filename your.pdmodel --params_filename your.pdiparams --save_file model.onnx   
会看到输出                           
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./pdmodel.pdmodel
[Paddle2ONNX] Parameters file path: ./pdmodel.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] [bilinear_interp_v2: bilinear_interp_v2_1.tmp_0] Requires the minimal opset version of 11.
[Paddle2ONNX] [pixel_shuffle: pixel_shuffle_1.tmp_0] Requires the minimal opset version of 11.
[Paddle2ONNX] [pixel_shuffle: pixel_shuffle_2.tmp_0] Requires the minimal opset version of 11.
[Paddle2ONNX] Due to the operator: bilinear_interp_v2, requires opset_version >= 11.
[Paddle2ONNX] Opset version will change to 11 from 9
[Paddle2ONNX] Use opset_version = 11 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2024-04-09 11:55:50 [INFO]	===============Make PaddlePaddle Better!================
2024-04-09 11:55:50 [INFO]	A little survey: https://iwenjuan.baidu.com/?code=r8hu2s

关于pdparams和pdiparams两种参数文件的区别,参考https://www.paddlepaddle.org.cn/documentation/docs/zh/faq/save_cn.html中的描述

Step2:From ONNX to TensorFlow

使用https://github.com/onnx/onnx-tensorflow

pip install tensorflow-addons
pip install tensorflow-probability==0.22.1 
pip install onnx-tf

接下来

onnx-tf convert -i model.onnx -o model.pb

会看到输出

2024-04-09 07:03:32,346 - onnx-tf - INFO - Start converting onnx pb to tf saved model
2024-04-09 07:03:41,015 - onnx-tf - INFO - Converting completes successfully.
INFO:onnx-tf:Converting completes successfully.

在model.pb目录下可以看到saved_model.pb

Step3:From TensorFlow to tflite

参考https://www.tensorflow.org/lite/convert?hl=zh-cn 编写python脚本

import tensorflow as tf
# Convert the model
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) # path to the SavedModel directory
tflite_model = converter.convert()

# Save the model.
with open('model.tflite', 'wb') as f:
  f.write(tflite_model)

运行python脚本,会看到输出

2024-04-09 07:16:45.514656: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:378] Ignored output_format.
2024-04-09 07:16:45.514767: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:381] Ignored drop_control_dependency.
2024-04-09 07:16:45.515630: I tensorflow/cc/saved_model/reader.cc:83] Reading SavedModel from: .
2024-04-09 07:16:45.517291: I tensorflow/cc/saved_model/reader.cc:51] Reading meta graph with tags { serve }
2024-04-09 07:16:45.517352: I tensorflow/cc/saved_model/reader.cc:146] Reading SavedModel debug info (if present) from: .
2024-04-09 07:16:45.523781: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:382] MLIR V1 optimization pass is not enabled
2024-04-09 07:16:45.524480: I tensorflow/cc/saved_model/loader.cc:233] Restoring SavedModel bundle.
2024-04-09 07:16:45.543346: I tensorflow/cc/saved_model/loader.cc:217] Running initialization op on SavedModel bundle at path: .
2024-04-09 07:16:45.559402: I tensorflow/cc/saved_model/loader.cc:316] SavedModel load for tags { serve }; Status: success: OK. Took 43775 microseconds.
2024-04-09 07:16:45.584171: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.
2024-04-09 07:16:45.635201: I tensorflow/compiler/mlir/lite/flatbuffer_export.cc:2245] Estimated count of arithmetic op

到此大功告成!

```cpp #include <verilated.h> // 包含模型的头文件,从 "top.v" 生成 #include "Vtop.h" int main(int argc, char** argv) { // 在 verilator manpage 中可以找到类似的例子 // 这个示例旨在提供一个最简化的例子。在开始一个真实项目之前,最好从一个更完整的例子开始, // 例如 examples/c_tracing。 // 构建一个 VerilatedContext 对象来保存仿真时间等信息 VerilatedContext* contextp = new VerilatedContext; // 传递命令行参数,以便 Verilated 代码可以访问它们,例如 $value$plusargs // 在创建任何模型之前需要调用这个函数 contextp->commandArgs(argc, argv); // 从 Vtop.h (从 "top.v" 生成)构造 Verilated 模型 Vtop* top = new Vtop{contextp}; // 模拟直到 $finish while (!contextp->gotFinish()) { // 评估模型 top->eval(); } // 最终模型清理 top->final(); // 销毁模型 delete top; // 返回正常完成状态 return 0; } ``` 这段代码是一个使用 Verilator 进行仿真的示例。它包含了一些注释来解释代码的功能和用途。首先,它包含了必要的头文件和库。然后,它创建了一个 VerilatedContext 对象来保存仿真的上下文信息。接着,它传递命令行参数给 Verilated 代码。然后,它使用从 "top.v" 文件生成的 Vtop.h 头文件构造了 Verilated 模型。在一个 while 循环中,它不断评估模型,直到仿真结束(即遇到 $finish)。最后,它进行了最终的模型清理和销毁,并返回正常完成状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhanghui_cuc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值