一文看懂如何使用模型轉換工具X2Paddle
本文轉載自百度PaddlePaddle
深度學習的應用主要包括兩個部分,一是通過深度學習框架訓練出模型,二是利用訓練出來的模型進行預測。
開發者基于不同的深度學習框架能夠得到不同的訓練模型,如果想要基于一種框架進行預測,就必須要解決不同框架的模型之間的匹配問題。基于這種考慮,也為了幫助用戶快速從其他框架遷移,PaddlePaddle開源了模型轉換工具X2Paddle。
它可以將TensorFlow、Caffe 的模型轉換為PaddlePaddle的核心框架Paddle Fluid可加載的格式。同時X2Paddle還支持ONNX格式的模型轉換,這樣也相當于支持了眾多可以轉換為ONNX格式的框架,比如PyTorch、MXNet、CNTK等。
項目地址:
https://github.com/PaddlePaddle/X2Paddle
項目概覽
X2Paddle最新發布的V0.3版本,包括tensorflow2fluid,caffe2fluid和onnx2fluid。對于TesorFlow和Caffe,我們還提供了它們與Paddle Fluid的常用API對比文檔。通過這些文檔可以清楚查看這幾個框架在API設計上的異同,方便用戶快速熟悉PaddlePaddle的接口使用。
caff2fluid
1、支持VGG, ResNet, AlexNet等圖像分類模型的轉換
2、提供Caffe-PaddlePaddle常用API的對比文檔,地址:https://github.com/PaddlePaddle/X2Paddle/tree/master/caffe2fluid/doc
tensorflow2fluid
1、支持VGG, ResNet, NASNet, YOLO-V3, UNet等圖像分類,檢測和分割模型的轉換
2、提供TensorFlow-PaddlePaddle常用API的對比文檔,地址:
https://github.com/PaddlePaddle/X2Paddle/tree/master/tensorflow2fluid/doc
onnx2fluid
1、支持VGG,ResNet,Inception, YOLO-V2, UNet等圖像分類,檢測和分割模型的轉換;
2、部分框架,如PyTorch支持導出為ONNX模型,因此也可通過onnx2fluid支持相應框架下模型轉換至PaddlePaddle
接下來我們將以tensorflow2fluid轉換VGG_16模型為例,介紹其使用方法。
VGG_16是CV領域的一個經典模型,本文檔以tensorflow/models下的VGG_16為例,展示如何將TensorFlow訓練好的模型轉換為PaddlePaddle模型。
模型轉換實戰
1.環境準備
模型轉換和測試的環境依賴TensorFlow和PaddlePaddle,通過如下方式安裝相應依賴(CPU或GPU版本)
CPU版本
pip install tensorflow==1.13.1 pip install paddlepaddle==1.4.0
GPU版本
pip install tensorflow-gpu==1.13.1 pip install paddlepaddle-gpu==1.4.1.post97 git clone https://github.com/PaddlePaddle/X2Paddle.git cd X2Paddle/tensorflow2fluid
2.下載預訓練模型
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz tar xzvf vgg_16_2016_08_28.tar.gz
3.保存模型為checkpoint格式
下載的模型vgg_16.ckpt僅保存了模型參數,需加載模型,并通過tf.train.Saver重新將模型保存成tensorflow2fluid支持的格式
import tensorflow.contrib.slim as slim
from tensorflow.contrib.slim.nets import vgg
import tensorflow as tf
import numpy
with tf.Session() as sess:
inputs = tf.placeholder(dtype=tf.float32,
shape=[None, 224, 224, 3],
name='inputs')
with slim.arg_scope(vgg.vgg_arg_scope()):
logits, endpoint = vgg.vgg_16(inputs,
num_classes=1000,
is_training=False)
# 加載模型
load_model = slim.assign_from_checkpoint_fn(
"vgg_16.ckpt",
slim.get_model_variables("vgg_16"))
load_model(sess)
# 測試樣例數據
numpy.random.seed(13)
data = numpy.random.rand(5, 224, 224, 3)
output_tensor = sess.graph.get_tensor_by_name(
"vgg_16/fc8/squeezed:0")
result = sess.run([output_tensor], {inputs:data})
numpy.save("tf_result.npy", numpy.array(result))
# 保存為tensorflow2fluid支持的模型格式
saver = tf.train.Saver()
saver.save(sess, "./checkpoint/model")
4.將模型轉換為PaddlePaddle模型
模型轉換時,需要指定輸入tensor的name和shape, batch維以None表示, 同時還要指定輸出tensor的name。轉換過程中,會根據輸入和輸出的tensor對計算圖進行裁剪,僅轉換輸入與輸出之間的子圖。
python tf2fluid/convert.py --meta_file checkpoint/model.meta --ckpt_dir checkpoint --in_nodes inputs --input_shape None,224,224,3 --output_nodes vgg_16/fc8/squeezed --use_cuda False --input_format NHWC --save_dir paddle_model
注意:由于在轉換過程中,涉及到部分TensorFlow模型中的參數實時infer,因此通過use_cuda參數可設置infer時是否使用GPU
轉換后的模型目錄中的各文件含義如下表所示,
5.加載轉換后的PaddlePaddle模型,并進行預測
tensorflow2fluid在tf2fluid/model_loader.py中封裝了模型加載方法,可通過如下示例代碼加載模型,并進行預測。
import tf2fluid.model_loader as ml
import numpy
model = ml.ModelLoader("paddle_model", use_cuda=False)
numpy.random.seed(13)
data = numpy.random.rand(5, 224, 224, 3).astype("float32")
# NHWC -> NCHW
data = numpy.transpose(data, (0, 3, 1, 2))
results = model.inference(feed_dict={model.inputs[0]:data})
numpy.save("pd_result.npy", numpy.array(results))
可通過調用save_inference_model,將模型結構和模型參數均序列化保存,如下代碼所示
model.save_inference_model("new_model_dir")
序列化后的模型加載方式可參考PaddlePaddle官網文檔說明:
http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_guides/low_level/inference.html#id4
6.對比轉換前后模型之前的預測結果差異
在上文的代碼中,我們均通過固定隨機數據方式,在TensorFlow和PaddlePaddle模型中輸入了相同的樣例數據,并將結果保存至tf_result.npy和pd_result.npy中,通過對比兩個結果的差異,判斷模型的轉換是否符合需求。
如下代碼對比的僅為輸入一個樣例數據后的差異對比,實際應用場景中,建議用戶根據需求定義自己的測試數據進行更嚴謹的對比測試。
import numpy
paddle_result = numpy.load("pd_result.npy")
tensorflow_result = numpy.load("tf_result.npy")
diff = numpy.fabs(paddle_result - tensorflow_result)
print(numpy.max(diff))
輸出: 1.1920929e-06
總結
X2Paddle以用戶的需求為導向,對于用戶而言不僅可以方便模型的遷移,同時提供的相應API對比文檔也可幫助用戶通過現有框架的使用經驗快速上手PaddlePaddle的使用。目前X2Paddle已經支持了眾多的CV領域的經典模型,有需求的小伙伴們趕緊試用起來吧!
— 完 —
- 長城汽車自研芯片點亮!提前布局下一代架構RISC-V,魏建軍:不能再受制于人2024-09-27
- 騰訊云發布自研大數據高性能計算引擎Meson,性能最高提升6倍2024-07-04
- Intel2024-03-18
- 數字員工全新發布 加速企業轉型2024-01-15



