天天看點

60分鐘教你上手PaddleHub

60分鐘教你上手PaddleHub

PaddleHub 介紹

  PaddleHub 是基于 PaddlePaddle 開發的預訓練模型管理工具,可以借助預訓練模型更便捷地開展遷移學習工作,旨在讓 PaddlePaddle 生态下的開發者更便捷體驗到大規模預訓練模型的價值。

  PaddleHub 目前的預訓練模型覆寫了圖像分類、目标檢測、詞法分析、Transformer、情感分析五大類别。未來會持續開放更多類型的深度學習模型,如語言模型、視訊分類、圖像生成等預訓練模型。

PytorchHub V.S PaddleHub

1)支援模型數量

PytorchHub 目前支援18個模型,PaddleHub支援29個,下面來看看分别支援哪些模型:

60分鐘教你上手PaddleHub

 PytorchHub目前支援18種模型

60分鐘教你上手PaddleHub

 PaddleHub目前支援29種模型

    從圖中可以看到,PaddleHub支援的模型數量有絕對的優勢;而PytorchHub涉及的方向更多,但是每個方向的模型并不多,對CV的支援更多;PaddleHub涉及的方向隻有兩個,CV和NLP,但是對NLP的支援尤其多,高達22個,不僅包括目前最潮的BERT,還有百度自己研發的知識增強語義表示模型Ernie,在多個中文NLP任務中表現超過BERT,除此之外還有對話系統的一系列模型,做智能客服、智能音箱的同學可以使用一下~

2)是否支援指令行運作

    目前PytorchHub不支援指令行運作,但PaddleHub支援,指令行運作就是指我們安裝PaddleHub後,可以無需進入python環境,即可快速體驗PaddleHub無需代碼、一鍵預測的指令行功能。需要注意的是,在PaddleHub中,既可以支援指令行使用,即在終端輸入

hub run XXX(模型) --input_text XXX(需要預測的内容)
           

也可以支援調用api

import paddlehub as hub

hub.finetune_and_eval(
    task, 
    data_reader, 
    feed_list, 
    config=None)
           

    實際上,PaddleHub為Model和Module的管理和使用都提供了指令行工具,但是model和module是有差別的,一個是模型,一個是子產品。

    model表示預訓練好的參數和模型,當需要使用Model進行預測時,需要模型配套的代碼,進行模型的加載,資料的預處理等操作後,才能進行預測。我們在使用PaddleHub來調用模型時,可以使用hub download 指令擷取到最新的model再進行實驗。module是model的一個可執行子產品,簡單來說,一個Module可以支援直接指令行預測,也可以配合PaddleHub Finetune API,通過少量代碼實作遷移學習。 需要注意的是,不是所有的Module都支援指令行預測; (例如BERT/ERNIE Transformer類模型,一般需要搭配任務進行finetune) 也不是所有的Module都可用于finetune(例如LAC詞法分析模型,我們不建議使用者用于finetune)

3)是否支援Fine-tune

    PyTorchHub 不支援Fine-tune,PaddleHub支援。這一點倒是挺讓人意外的,如果通過hub加載了預訓練模型,但是無法Fine-tune,那有什麼意義呢?僅僅隻是為了試試paper中的效果好不好嗎?本來我還對此頗有懷疑,于是去看了pytorchhub.org官網下的文檔,發現目前pytorchhub确實不支援hub一鍵式fine-tuning,現有模型的finetuning還是基于傳統的腳本式調參。

    PaddleHub在Fine-tune這一塊做的很完善,在前一個闆塊也給大家詳細舉了示例講解,在PaddleHub的官方gihub中,有非常詳細的Fine-tune教程,大家可以參考:

PaddleHub圖像分類遷移:

https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub圖像分類遷移教程
           

PaddleHub文本分類遷移:

https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分類遷移教程
           

是否支援使用者自定義上傳模型

    PyTorchHub 支援,PaddleHub不支援。我看了pytorchhub.org官網下的文檔,隻需要在開源的模型代碼裡增加了一個hubconf.py, 然後在pytorch/hub裡提一個pr,cr後merge到 branch/tag 這個分支就ok了。

方法非常簡單,代碼也不複雜。

torch.hub.load(github, model, force_reload=False, *args, **kwargs)
           

     PaddleHub目前暫時還不支援使用者自己送出新模型,但是據可靠消息表示:預計7月份就會支援這個功能,到時候希望大家能踴躍使用,push自己的新模型~

    總結一下四個次元的比較:

60分鐘教你上手PaddleHub

    總之,從這四個次元上,個人感覺PytorchHub更像一個小工具,幫助大家迅速試用一下開源的新模型,但是真正到實際應用,還是要基于老的一套的fine-tuning,不能直接從hub裡調用fine-tune的api,是以并不實用。對于遷移學習來說,Fine-tune是必不可少的,雖然我們有預訓練的模型,但是新任務的場景和資料都不相同,直接使用預訓練模型其實很難得到很好的效果,是以從工業級實用的角度來說,PaddleHub做的要更成熟一些,等稍後支援了使用者自定義上傳模型後大家可以多體驗體驗。

    下面,我們具體來看看PaddleHub如何直接使用指令行,調用一行代碼show出結果& 使用Finetune Api來對模型進行微調,并舉一個執行個體教大家一步一步實作。

PaddleHub安裝

  • 環境依賴
    • Python==2.7 or Python>=3.5
    • PaddlePaddle>=1.4.0
  • 安裝
    pip install paddlehub
               

指令行快速體驗

    安裝好後,不需要進入python環境import就可以直接先體驗hub的便捷,因為在PaddleHub中hub可以作為一個獨立的子產品直接運作。PaddleHub目前包含圖像分類、目标檢測、詞法分析、Transformer、情感分析五大類。

 一行代碼預測

  • 分詞
# 使用百度詞法分析工具LAC進行分詞
$ hub run lac --input_text "今天的你真好看"
[{'tag': ['TIME', 'u', 'r', 'd', 'a'], 'word': ['今天', '的', '你', '真', '好看']}]
           
  • 情感分析
# 使用百度Senta情感分析模型對句子進行預測
$ hub run senta_bilstm --input_text "老鐵666,帶你開黑"
[{'text': '老鐵666,帶你開黑', 'sentiment_key': 'positive', 'sentiment_label': 2, 'positive_probs': 0.7206, 'negative_probs': 0.2794}]
           
  • 目标檢測
#使用SSD檢測模型對圖檔進行目标檢測
hub run ssd_mobilenet_v1_pascal --input_path test_img_bird.jpg
           

    檢測結果

60分鐘教你上手PaddleHub
  • 圖像識别
# 使用resnet-50做圖像識别
           
hub run resnet_v2_50_imagenet --input_path test_img_bird.jpg
Install Module resnet_v2_50_imagenet
Downloading resnet_v2_50_imagenet
[==================================================] 100.00%
Uncompress /root/.paddlehub/cache/resnet_v2_50_imagenet
[==================================================] 100.00%
Successfully installed resnet_v2_50_imagenet-1.0.0
[[{'brambling': 0.4907981}]]
           

注:模型未下載下傳時會先下載下傳再預測,也可以先試用hub install model_name 下載下傳好模型再使用hub run預測,也可直接運作hub run。hub一共有十個指令,其他指令可參考PaddleHub指令行工具。

支援29種模型

PaddleHub目前支援29種模型,主要以CV和NLP模型為主,包括NLP目前最火的BERT和百度自己自己研發開源的Ernie,以及CV中的ssd-mobilenet、resnet-50、resnet-152等。

  • NLP預測

       資料通過 —input_text或—input_file導入來實作單次預測和批量預測

# 單文本預測
hub run lac --input_text "今天是個好日子"
# 多文本分析
hub run lac --input_file test.txt
           
  • CV預測

    資料通過—input_path或—input_file導入來實作單次預測和批量預測

# 單張照片預測
hub run ssd_mobilenet_v1_pascal --input_path test.jpg
# 多張照片預測
hub run ssd_mobilenet_v1_pascal --input_file test.txt
           

支援遷移學習,Fine-tune更Easy

Fine-tune全景圖

60分鐘教你上手PaddleHub

    PaddleHub+Finetune流程圖

60分鐘教你上手PaddleHub

PaddleHub Finetune api

    Fine-tune是遷移學習中使用最多的方式之一,通常我們可以在預訓練好的模型上進行微調來實作模型遷移,進而達到模型适應新領域(Domain)資料的目的。上圖是做一個完整的遷移學習需要的步驟,下面舉個執行個體教大家如何用PaddleHub做圖像分類遷移學習

1.準備工作

安裝paddlepaddle和paddlehub

pip install paddlepaddle( 推薦安裝1.4.0版本以上)

pip install paddlehub
           

2.選擇模型

此處使用經典的ResNet-50作為預訓練模型

module_map = {
    "resnet50": "resnet_v2_50_imagenet",
    "resnet101": "resnet_v2_101_imagenet",
    "resnet152": "resnet_v2_152_imagenet",
    "mobilenet": "mobilenet_v2_imagenet",
    "nasnet": "nasnet_imagenet",
    "pnasnet": "pnasnet_imagenet"
}

module_name = module_map["resnet50"]
module = hub.Module(name = module_name)
           

3.準備資料

# 直接用PaddleHub提供的資料集
dataset = hub.dataset.DogCat()# 生成readerdata_reader = hub.reader.ImageClassificationReader(
    image_width=module.get_expected_image_width(),
    image_height=module.get_expected_image_height(),
    images_mean=module.get_pretrained_images_mean(),
    images_std=module.get_pretrained_images_std(),
    dataset=dataset)
           

4.組建Finetune Task

    由于貓狗分類是一個二分類的任務,而我們下載下傳的分類module是在ImageNet資料集上訓練的千分類模型,是以我們需要對模型進行簡單的微調,把模型改造為一個二分類模型:

    1. 擷取module的上下文環境,包括輸入和輸出的變量,以及Paddle Program;

    2.從輸出變量中找到特征圖提取層feature_map;

    3.在feature_map後面接入一個全連接配接層,生成Task

input_dict, output_dict, program = module.context(trainable=True)
img = input_dict["image"]
feature_map = output_dict["feature_map"]

task = hub.create_img_cls_task(
    feature=feature_map, num_classes=dataset.num_labels)

feed_list = [img.name, task.variable("label").name]# 設定configconfig = hub.RunConfig(    use_cuda=False,
    num_epoch=1,
    checkpoint_dir="cv_finetune_turtorial_demo",
    batch_size=32,
    log_interval=10,
    eval_interval=50,
    strategy=hub.finetune.strategy.DefaultFinetuneStrategy())
           

5.啟動Fine-tune并檢視效果

    可以選擇

finetune_and_eval

接口來進行模型訓練,這個接口在finetune的過程中,會周期性的進行模型效果的評估,以便我們了解整個訓練過程的性能變化。

hub.finetune_and_eval(
    task, feed_list=feed_list, data_reader=data_reader, config=config)
           

    訓練過程中的性能資料會被記錄到本地,我們可以通過visualdl來可視化這些資料。我們在shell中輸入以下指令來啟動visualdl,其中

${HOST_IP}

為本機IP,需要使用者自行指定

$ visualdl --logdir ./cv_finetune_turtorial_demo/vdllog --host ${HOST_IP} --port 8989
           

    啟動服務後,我們使用浏覽器通路

${HOST_IP}:8989

,可以看到訓練以及預測的loss曲線和accuracy曲線

60分鐘教你上手PaddleHub

        最後再按照正常流程對模型進行預測即可。

繼續閱讀