一文带你看懂PaddleHub
作者丨Charlotte77
來源丨我愛PaddlePaddle
Hub 是什么?Hub 本意是中心,docker 有 docker Hub,大家可以把自己創建的鏡像打包提交到 docker hub 上,需要的時候再 pull 下來,非常方便,那么模型是不是也可以這樣玩呢?
完全可以!很多時候我們不需要從頭開始訓練模型,如果有預訓練好的模型,直接做遷移學習就可以,但是傳統的方式基本上都需要從各個官網上去下載,模型比較大,用起來并不輕量。現在各家都發布了 Hub ,可以直接從 Hub 上下載 pretrain 模型做 finetune 或預測,極大的減輕了工作量。下面直接從四個維度對比 PyTorch Hub 和 PaddleHub。
PyTorch Hub v.s. PaddleHub
支持模型數量
Pytorch Hub 目前支持 18 個模型,PaddleHub 支持 29 個,包含 16 個 model 和 13 個 module,model 可以直接使用,module 提供了預訓練模型的參數,支持命令行調用,下面來看看分別支持哪些模型:
▲?PyTorch Hub目前支持18種模型
▲?PaddleHub目前支持29種模型(包含model和module)
從圖中可以看到,PaddleHub 支持的模型數量有絕對的優勢;而 PyTorch Hub 涉及的方向更多,但是每個方向的模型并不多,對 CV 的支持更多;PaddleHub 涉及的方向只有兩個,CV 和 NLP,但是對 NLP 的支持尤其多,高達 22 個,不僅包括目前最潮的 BERT,還有百度自己研發的知識增強語義表示模型 ERNIE,在多個中文 NLP 任務中表現超過 BERT。
是否支持命令行運行
目前 PyTorch Hub 不支持命令行運行,但 PaddleHub 支持,命令行運行就是指我們安裝 PaddleHub 后,可以無需進入 Python 環境,即可快速體驗 PaddleHub 無需代碼、一鍵預測的命令行功能。需要注意的是,在 PaddleHub 中,既可以支持命令行使用,即在終端輸入,如下所示:
也可以支持調用 api,如下所示:
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),具體區別請見 PaddleHub 的 github wiki(參考文獻 2)。
是否支持Fine-tune
PyTorch Hub 沒有 Fine-tune 接口,PaddleHub 可以支持直接從 hub 調用 Fine-tune 的 api。在 https://pytorch.org/ 官網下的文檔中可以看到,目前 PyTorch Hub 不支持 hub 一鍵式 fine-tuning,現有模型的 finetuning 還是基于傳統的腳本式調參。
PaddleHub 在 Fine-tune 這一塊做的很完善,在前一個板塊也給大家詳細舉了示例講解,在 PaddleHub 的官方 GitHub 中,有非常詳細的 Fine-tune 教程,大家可以參考:
PaddleHub 圖像分類遷移:?
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub圖像分類遷移教程?
PaddleHub 文本分類遷移:
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分類遷移教程
是否支持用戶自定義上傳模型
PyTorch Hub 支持,PaddleHub 不支持。我看了 https://pytorch.org/ 官網下的文檔,只需要在開源的模型代碼里增加了一個 hubconf.py,然后在 pytorch/hub 里提一個 pr,cr 后 merge 到 branch/tag 這個分支就 ok 了。方法非常簡單,代碼也不復雜。
PaddleHub 目前暫時還不支持用戶自己提交新模型,但后期應該會支持這個功能,到時候希望大家能踴躍使用,push 自己的新模型。
總結一下四個維度的比較:
總之,從這四個維度上,我個人感覺 PyTorch Hub 更像一個小工具,幫助大家迅速試用一下開源的新模型,但是真正到實際應用,還是要基于老的一套的 fine-tuning,不能直接從 hub 里調用 fine-tune 的 api,所以并不實用。從工業級實用的角度來說,PaddleHub 做的要更成熟一些,用戶可以更方便的使用 PaddleHub 來進行 Fine-tune。
下面,我們具體來看看 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、情感分析五大類。
一行代碼預測
分詞
$?hub?run?lac?--input_text?"今天的你真好看"?
[{'tag':?['TIME',?'u',?'r',?'d',?'a'],?'word':?['今天',?'的',?'你',?'真',?'好看']}]
情感分析
$?hub?run?senta_bilstm?--input_text?"老鐵666,帶你開黑"?
[{'text':?'老鐵666,帶你開黑',?
'sentiment_key':?'positive',?'sentiment_label':?2,?'positive_probs':?0.72
06,?'negative_probs':?0.2794}]
目標檢測
hub?run?ssd_mobilenet_v1_pascal?--input_path?test_img_bird.jpg
檢測結果:
圖像識別
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 命令行工具(參考文獻 2)。
支持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全景圖
▲?PaddleHub+Finetune流程圖
▲?PaddleHub Finetune api
Fine-tune 是遷移學習中使用最多的方式之一,通常我們可以在預訓練好的模型上進行微調來實現模型遷移,從而達到模型適應新領域(Domain)數據的目的。上圖是做一個完整的遷移學習需要的步驟,下面舉個實例教大家如何用 PaddleHub 做圖像分類遷移學習。
1. 準備工作
安裝 PaddlePaddle 和 PaddleHub
pip?install?paddlehub
2. 選擇模型
此處使用經典的 ResNet-50 作為預訓練模型。
"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. 準備數據
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 數據集上訓練的千分類模型,所以我們需要對模型進行簡單的微調,把模型改造為一個二分類模型:
獲取 module 的上下文環境,包括輸入和輸出的變量,以及 Paddle Program;
量中找到特征圖提取層 feature_map;
在 feature_map 后面接入一個全連接層,生成 Task。
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 的過程中,會周期性的進行模型效果的評估,以便我們了解整個訓練過程的性能變化。
訓練過程中的性能數據會被記錄到本地,我們可以通過 VisualDL 來可視化這些數據。我們在 shell 中輸入以下命令來啟動 VisualDL,其中 ${HOST_IP} 為本機 IP,需要用戶自行指定。
啟動服務后,我們使用瀏覽器訪問 ${HOST_IP}:8989,可以看到訓練以及預測的 loss 曲線和 accuracy 曲線。
最后再按照常規流程對模型進行預測即可。
參考資料
[1] PaddleHub官方github:
https://github.com/PaddlePaddle/PaddleHub?
[2] PaddleHub命令行工具:
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub命令行工具?
[3] Paddle-code:
https://github.com/huxiaoman7/PaddlePaddle_code?
[4] Paddle-models:
https://github.com/PaddlePaddle/models?
[5] Pytorch Hub:
https://pytorch.org/blog/towards-reproducible-research-with-pytorch-hub/
?
長按識別下方二維碼
免費申請Tesla V100算力卡
配合PaddleHub讓模型原地起飛
?
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的一文带你看懂PaddleHub的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Bert遇上Keras:这可能是Ber
- 下一篇: 备战秋招 |《百面机器学习》算法+lee