手把手教你將pytorch模型轉換爲PaddlePaddle模型

本文手把手教你將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模型卻苦於沒有算力運行的你
  • 但願快速將pytorch工程遷移爲PaddlePaddle的你
  • 但願快速使用PaddlePaddle又不想重現訓練模型的你
  • 垂涎aitduio的V100已久卻不想花太多時間學習PaddlePaddle細節的你
 

1.將pytorch模型轉換爲PaddlePaddle模型

將pytorch模型轉換爲PaddlePaddle模型須要先把把pytorch轉換爲onnx模型,而後轉換爲PaddlePaddle模型。github

note:因爲aistudio不支持pytorch,你須要在本地完成此轉換過程。web

 

1.1 依賴庫

在實踐下述代碼前,你須要確保本地環境知足如下依賴庫:app

  • torch
  • oxnn
pip install onnx==1.6.0
  • onnxruntime
pip install onnxruntime==1.0.0
  • paddlepaddle >= 1.6.0
  • X2Paddle
git clone https://github.com/PaddlePaddle/X2Paddle.git
cd X2Paddle
git checkout develop
python setup.py install
 

1.2 實驗環境:

本文所用pytorch模型爲nasnetamobile ,用遷移訓練在Stanford Dogs數據集全集上訓練20個epochs所得。函數

  • pytorch模型定義文件,本文采用nasnet_mobile.py
  • pytorch模型參數,本文中所用爲nasnet_mobile.pkl

note:學習

  1. 上文所提兩文件均在/home/aistudio目錄下,讀者可自行下載進行實驗
  2. 若是你須要轉換本身的pytorch模型一樣也須要提供模型定義文件模型參數文件
 

1.3 實驗步驟:

實驗步驟爲先把pytorch轉換爲onnx模型,而後轉換爲PaddlePaddle模型。測試

 

1.3.1 把pytorch模型轉換爲onnx模型

定義一個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. 將1處導入模型替換爲本身的模型

  2. 將輸入大小的shape替換爲本身模型的輸入大小shape

  3. 按需傳入模型參數

  4. 將路徑修改成你的模型參數的位置

  5. 修改輸出onnx模型的名稱

本地終端中輸入:

python trans.py

所轉換的onnx模型存放在當前目錄。

 

1.3.2 將onnx模型轉換爲PaddlePaddle模型

本地終端輸入如下代碼:

x2paddle --framework=onnx --model=nasnet.onnx --save_dir=pd_model

最終的PaddlePaddle模型存放在pd_model目錄。

pd_model目錄下有兩個文件夾

-->inference_model 只存放了模型參數。

-->model_with_code 不只存放了模型參數,還生成了模型定義。

 

2. 轉換所得PaddlePaddle模型應用示例

下面咱們用一張圖片看看轉換所得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程序,看看模型的推理結果是否如預期。

In[1]
cd ./pd_model/
/home/aistudio/pd_model
In[3]
import zipfile
tar = zipfile.ZipFile('/home/aistudio/pd_model/model_with_code_zip.zip','r')
tar.extractall()
In[4]
cd ./model_with_code/
/home/aistudio/pd_model/model_with_code
In[5]
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)
In[6]
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
In[7]
#模型推理函數
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
In[8]
#將標籤爲32的圖片進行預處理
img = process_img("/home/aistudio/n02085782_1039.jpg")
In[9]
#用PaddlePaddle模型推理圖片標籤
pred_label, pred_score = inference(img)
In[10]
print("預測圖片{}的標籤爲{}".format("/home/aistudio/n02085782_1039.jpg",pred_label))
預測圖片/home/aistudio/n02085782_1039.jpg的標籤爲32
 

可見模型能夠如期推理出標籤,那麼咱們的轉換大功告成,接下來就能夠在aistidio平臺愉快的用所轉換的模型作各類下游任務了。

在最後作一點小小的宣傳,我是西安電子科技大學在讀研究生,感興趣的領域包括模型壓縮,對抗樣本,知識圖譜。歡迎交流關注。來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 官網,瞭解更多相關內容  

相關文章
相關標籤/搜索