一文带你看懂PaddleHub
作者丨Charlotte77
來源丨我愛PaddlePaddle
Hub 是什么?Hub 本意是中心,docker 有 docker Hub,大家可以把自己創(chuàng)建的鏡像打包提交到 docker hub 上,需要的時候再 pull 下來,非常方便,那么模型是不是也可以這樣玩呢?
完全可以!很多時候我們不需要從頭開始訓(xùn)練模型,如果有預(yù)訓(xùn)練好的模型,直接做遷移學(xué)習(xí)就可以,但是傳統(tǒng)的方式基本上都需要從各個官網(wǎng)上去下載,模型比較大,用起來并不輕量。現(xiàn)在各家都發(fā)布了 Hub ,可以直接從 Hub 上下載 pretrain 模型做 finetune 或預(yù)測,極大的減輕了工作量。下面直接從四個維度對比 PyTorch Hub 和 PaddleHub。
PyTorch Hub v.s. PaddleHub
支持模型數(shù)量
Pytorch Hub 目前支持 18 個模型,PaddleHub 支持 29 個,包含 16 個 model 和 13 個 module,model 可以直接使用,module 提供了預(yù)訓(xùn)練模型的參數(shù),支持命令行調(diào)用,下面來看看分別支持哪些模型:
▲?PyTorch Hub目前支持18種模型
▲?PaddleHub目前支持29種模型(包含model和module)
從圖中可以看到,PaddleHub 支持的模型數(shù)量有絕對的優(yōu)勢;而 PyTorch Hub 涉及的方向更多,但是每個方向的模型并不多,對 CV 的支持更多;PaddleHub 涉及的方向只有兩個,CV 和 NLP,但是對 NLP 的支持尤其多,高達(dá) 22 個,不僅包括目前最潮的 BERT,還有百度自己研發(fā)的知識增強語義表示模型 ERNIE,在多個中文 NLP 任務(wù)中表現(xiàn)超過 BERT。
是否支持命令行運行
目前 PyTorch Hub 不支持命令行運行,但 PaddleHub 支持,命令行運行就是指我們安裝 PaddleHub 后,可以無需進入 Python 環(huán)境,即可快速體驗 PaddleHub 無需代碼、一鍵預(yù)測的命令行功能。需要注意的是,在 PaddleHub 中,既可以支持命令行使用,即在終端輸入,如下所示:
也可以支持調(diào)用 api,如下所示:
hub.finetune_and_eval(?
task,?
data_reader,?
feed_list,?
config=None)
實際上,PaddleHub 為 Model 和 Module 的管理和使用都提供了命令行工具,但是 model 和 module 是有區(qū)別的,一個是模型,一個是模塊。?
model 表示預(yù)訓(xùn)練好的參數(shù)和模型,當(dāng)需要使用Model進行預(yù)測時,需要模型配套的代碼,進行模型的加載,數(shù)據(jù)的預(yù)處理等操作后,才能進行預(yù)測。我們在使用PaddleHub來調(diào)用模型時,可以使用hub download 命令獲取到最新的model再進行實驗。
module是model的一個可執(zhí)行模塊,簡單來說,一個 Module 可以支持直接命令行預(yù)測,也可以配合 PaddleHub Finetune API,通過少量代碼實現(xiàn)遷移學(xué)習(xí)。
需要注意的是,不是所有的 Module 都支持命令行預(yù)測(例如 BERT/ERNIE Transformer 類模型,一般需要搭配任務(wù)進行 finetune)。也不是所有的 Module 都可用于 finetune(例如 LAC 詞法分析模型,我們不建議用戶用于 finetune),具體區(qū)別請見 PaddleHub 的 github wiki(參考文獻(xiàn) 2)。
是否支持Fine-tune
PyTorch Hub 沒有 Fine-tune 接口,PaddleHub 可以支持直接從 hub 調(diào)用 Fine-tune 的 api。在 https://pytorch.org/ 官網(wǎng)下的文檔中可以看到,目前 PyTorch Hub 不支持 hub 一鍵式 fine-tuning,現(xiàn)有模型的 finetuning 還是基于傳統(tǒng)的腳本式調(diào)參。
PaddleHub 在 Fine-tune 這一塊做的很完善,在前一個板塊也給大家詳細(xì)舉了示例講解,在 PaddleHub 的官方 GitHub 中,有非常詳細(xì)的 Fine-tune 教程,大家可以參考:
PaddleHub 圖像分類遷移:?
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub圖像分類遷移教程?
PaddleHub 文本分類遷移:
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分類遷移教程
是否支持用戶自定義上傳模型
PyTorch Hub 支持,PaddleHub 不支持。我看了 https://pytorch.org/ 官網(wǎng)下的文檔,只需要在開源的模型代碼里增加了一個 hubconf.py,然后在 pytorch/hub 里提一個 pr,cr 后 merge 到 branch/tag 這個分支就 ok 了。方法非常簡單,代碼也不復(fù)雜。
PaddleHub 目前暫時還不支持用戶自己提交新模型,但后期應(yīng)該會支持這個功能,到時候希望大家能踴躍使用,push 自己的新模型。
總結(jié)一下四個維度的比較:
總之,從這四個維度上,我個人感覺 PyTorch Hub 更像一個小工具,幫助大家迅速試用一下開源的新模型,但是真正到實際應(yīng)用,還是要基于老的一套的 fine-tuning,不能直接從 hub 里調(diào)用 fine-tune 的 api,所以并不實用。從工業(yè)級實用的角度來說,PaddleHub 做的要更成熟一些,用戶可以更方便的使用 PaddleHub 來進行 Fine-tune。
下面,我們具體來看看 PaddleHub 如何直接使用命令行,調(diào)用一行代碼 show 出結(jié)果 &?使用 Finetune Api 來對模型進行微調(diào),并舉一個實例教大家一步一步實現(xiàn)。
一行命令調(diào)用,直接輸出結(jié)果
PaddleHub安裝
環(huán)境依賴
Python==2.7 or Python>=3.5
PaddlePaddle>=1.4.0
安裝
pip install paddlehub
命令行快速體驗
安裝好后,不需要進入 Python 環(huán)境 import 就可以直接先體驗 hub 的便捷,因為在 PaddleHub 中 hub 可以作為一個獨立的模塊直接運行。PaddleHub 目前包含圖像分類、目標(biāo)檢測、詞法分析、Transformer、情感分析五大類。
一行代碼預(yù)測
分詞
$?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}]
目標(biāo)檢測
hub?run?ssd_mobilenet_v1_pascal?--input_path?test_img_bird.jpg
檢測結(jié)果:
圖像識別
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}]]
注:模型未下載時會先下載再預(yù)測,也可以先試用 hub install model_name 下載好模型再使用 hub run 預(yù)測,也可直接運行 hub run。hub 一共有十個命令,其他命令可參考 PaddleHub 命令行工具(參考文獻(xiàn) 2)。
支持29種模型
PaddleHub 目前支持 29 種模型,主要以 CV 和 NLP 模型為主,包括 NLP 目前最火的 BERT 和百度自己自己研發(fā)開源的 ERNIE,以及 CV 中的 ssd-mobilenet、resnet-50、resnet-152 等。
NLP預(yù)測
數(shù)據(jù)通過 —input_text 或—input_file 導(dǎo)入來實現(xiàn)單次預(yù)測和批量預(yù)測
hub?run?lac?--input_text?"今天是個好日子"?
#?多文本分析?
hub?run?lac?--input_file?test.txt
CV預(yù)測
數(shù)據(jù)通過—input_path 或—input_file 導(dǎo)入來實現(xiàn)單次預(yù)測和批量預(yù)測
hub?run?ssd_mobilenet_v1_pascal?--input_path?test.jpg?
#?多張照片預(yù)測?
hub?run?ssd_mobilenet_v1_pascal?--input_file?test.txt
支持遷移學(xué)習(xí),Fine-tune更Easy
Fine-tune全景圖
▲?PaddleHub+Finetune流程圖
▲?PaddleHub Finetune api
Fine-tune 是遷移學(xué)習(xí)中使用最多的方式之一,通常我們可以在預(yù)訓(xùn)練好的模型上進行微調(diào)來實現(xiàn)模型遷移,從而達(dá)到模型適應(yīng)新領(lǐng)域(Domain)數(shù)據(jù)的目的。上圖是做一個完整的遷移學(xué)習(xí)需要的步驟,下面舉個實例教大家如何用 PaddleHub 做圖像分類遷移學(xué)習(xí)。
1. 準(zhǔn)備工作
安裝 PaddlePaddle 和 PaddleHub
pip?install?paddlehub
2. 選擇模型
此處使用經(jīng)典的 ResNet-50 作為預(yù)訓(xùn)練模型。
"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. 準(zhǔn)備數(shù)據(jù)
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
由于貓狗分類是一個二分類的任務(wù),而我們下載的分類 module 是在 ImageNet 數(shù)據(jù)集上訓(xùn)練的千分類模型,所以我們需要對模型進行簡單的微調(diào),把模型改造為一個二分類模型:
獲取 module 的上下文環(huán)境,包括輸入和輸出的變量,以及 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]#?設(shè)置
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 接口來進行模型訓(xùn)練,這個接口在 finetune 的過程中,會周期性的進行模型效果的評估,以便我們了解整個訓(xùn)練過程的性能變化。
訓(xùn)練過程中的性能數(shù)據(jù)會被記錄到本地,我們可以通過 VisualDL 來可視化這些數(shù)據(jù)。我們在 shell 中輸入以下命令來啟動 VisualDL,其中 ${HOST_IP} 為本機 IP,需要用戶自行指定。
啟動服務(wù)后,我們使用瀏覽器訪問 ${HOST_IP}:8989,可以看到訓(xùn)練以及預(yù)測的 loss 曲線和 accuracy 曲線。
最后再按照常規(guī)流程對模型進行預(yù)測即可。
參考資料
[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讓模型原地起飛
?
現(xiàn)在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的一文带你看懂PaddleHub的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当Bert遇上Keras:这可能是Ber
- 下一篇: 备战秋招 |《百面机器学习》算法+lee