本文手把手教你將pytorch模型轉換爲PaddlePaddle模型,並提供了PaddlePaddle模型使用使用實例。python
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
本項目適合如下人羣:git
將pytorch模型轉換爲PaddlePaddle模型須要先把把pytorch轉換爲onnx模型,而後轉換爲PaddlePaddle模型。github
note:因爲aistudio不支持pytorch,你須要在本地完成此轉換過程。web
在實踐下述代碼前,你須要確保本地環境知足如下依賴庫:app
pip install onnx==1.6.0
pip install onnxruntime==1.0.0
git clone https://github.com/PaddlePaddle/X2Paddle.git
cd X2Paddle
git checkout develop
python setup.py install
本文所用pytorch模型爲nasnetamobile ,用遷移訓練在Stanford Dogs數據集全集上訓練20個epochs所得。函數
note:學習
實驗步驟爲先把pytorch轉換爲onnx模型,而後轉換爲PaddlePaddle模型。測試
定義一個py文件名爲trans.py,具體代碼以下:fetch
#coding: utf-8 import torch #import torchvision # 1.導入pytorch模型定義 from nasnet_mobile import nasnetamobile # 2.指定輸入大小的shape dummy_input = torch.randn(1, 3, 224, 224) # 3. 構建pytorch model model = nasnetamobile(121,pretrained=False) # 4. 載入模型參數 model.load_state_dict(torch.load('/home/aistudio/data/data23875/nasnet_mobile.pkl', map_location='cpu')) # 5.導出onnx模型文件 torch.onnx.export(model, dummy_input, "nasnet.onnx",verbose=True)
note:若是你想轉換本身的模型,在此須要修改:(分別對應代碼中5處註釋)ui
將1處導入模型替換爲本身的模型
將輸入大小的shape替換爲本身模型的輸入大小shape
按需傳入模型參數
將路徑修改成你的模型參數的位置
修改輸出onnx模型的名稱
在本地終端中輸入:
python trans.py
所轉換的onnx模型存放在當前目錄。
在本地終端輸入如下代碼:
x2paddle --framework=onnx --model=nasnet.onnx --save_dir=pd_model
最終的PaddlePaddle模型存放在pd_model目錄。
pd_model目錄下有兩個文件夾
-->inference_model 只存放了模型參數。
-->model_with_code 不只存放了模型參數,還生成了模型定義。
下面咱們用一張圖片看看轉換所得PaddlePaddle模型是否能夠正常運行。
咱們有如下文件:
-->/home/aistudio/n02085782_1039.jpg 一張小狗的圖片,類別標籤爲32
-->/home/aistudio/pd_model/model_with_code 轉換所得Paddle模型的參數與模型定義(此部分爲我在本地轉換後上傳)
note :爲將圖片以參數形式傳入模型,/home/aistudio/pd_model/model_with_code/model.py中需修改兩處.
5)def x2paddle_net():
修改成def x2paddle_net(input):
8)x2paddle_input_1 = fluid.layers.data(dtype='float32', shape=[1, 3, 224, 224], name='x2paddle_input_1', append_batch_size=False)
修改成x2paddle_input_1 = input
下面咱們開始構建Paddle程序,看看模型的推理結果是否如預期。
cd ./pd_model/
/home/aistudio/pd_model
import zipfile tar = zipfile.ZipFile('/home/aistudio/pd_model/model_with_code_zip.zip','r') tar.extractall()
cd ./model_with_code/
/home/aistudio/pd_model/model_with_code
import argparse import functools import numpy as np import paddle.fluid as fluid from model import x2paddle_net use_gpu=True ######Attack graph adv_program=fluid.Program() #完成初始化 with fluid.program_guard(adv_program): input_layer = fluid.layers.data(name='image', shape=[3,224,224], dtype='float32') #設置爲能夠計算梯度 input_layer.stop_gradient=False # model definition _,out_logits = x2paddle_net(input=input_layer) out = fluid.layers.softmax(out_logits[0]) place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) #記載模型參數 fluid.io.load_persistables(exe, "./") #建立測試用評估模式 eval_program = adv_program.clone(for_test=True)
import cv2 #定義一個預處理圖像的函數 def process_img(img_path="",image_shape=[3,224,224]): mean = [0.485, 0.456, 0.406] std = [0.229, 0.224, 0.225] img = cv2.imread(img_path) img = cv2.resize(img,(image_shape[1],image_shape[2])) #img = cv2.resize(img,(256,256)) #img = crop_image(img, image_shape[1], True) #RBG img [224,224,3]->[3,224,224] img = img[:, :, ::-1].astype('float32').transpose((2, 0, 1)) / 255 #img = img.astype('float32').transpose((2, 0, 1)) / 255 img_mean = np.array(mean).reshape((3, 1, 1)) img_std = np.array(std).reshape((3, 1, 1)) img -= img_mean img /= img_std img=img.astype('float32') img=np.expand_dims(img, axis=0) return img
#模型推理函數 def inference(img): fetch_list = [out.name] result = exe.run(eval_program, fetch_list=fetch_list, feed={ 'image':img }) result = result[0][0] pred_label = np.argmax(result) pred_score = result[pred_label].copy() return pred_label, pred_score
#將標籤爲32的圖片進行預處理 img = process_img("/home/aistudio/n02085782_1039.jpg")
#用PaddlePaddle模型推理圖片標籤
pred_label, pred_score = inference(img)
print("預測圖片{}的標籤爲{}".format("/home/aistudio/n02085782_1039.jpg",pred_label))
預測圖片/home/aistudio/n02085782_1039.jpg的標籤爲32
在最後作一點小小的宣傳,我是西安電子科技大學在讀研究生,感興趣的領域包括模型壓縮,對抗樣本,知識圖譜。歡迎交流關注。來AI Studio互粉吧~等你哦~
使用AI Studio一鍵上手實踐項目吧https://aistudio.baidu.com/aistudio/projectdetail/312508
下載安裝命令 ## CPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安裝命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 訪問 PaddlePaddle 官網,瞭解更多相關內容。