PaddleHub中的模型
PaddleHub介紹

文章目錄
PaddleHub簡介
對比PytorchHub
與PaddleHub
Model與Module
Fine-tune
PaddleHub使用
PaddleHub安裝
命令行快速體驗
29種模型
遷移學(xué)習(xí)
Fine-Tune
訓(xùn)練過程
PaddleHub介紹
文章目錄
PaddleHub簡介
對比PytorchHub
與PaddleHub
Model與Module
Fine-tune
PaddleHub使用
PaddleHub安裝
命令行快速體驗
29種模型
遷移學(xué)習(xí)
Fine-Tune
訓(xùn)練過程
1.1 PaddleHub簡介
PaddleHub 是基于 PaddlePaddle 開發(fā)的預(yù)訓(xùn)練模型管理工具,可以借助預(yù)訓(xùn)練模型更便捷地開展遷移學(xué)習(xí)工作,旨在讓 PaddlePaddle 生態(tài)下的開發(fā)者更便捷體驗到大規(guī)模預(yù)訓(xùn)練模型的價值。
PaddleHub 目前的預(yù)訓(xùn)練模型覆蓋了圖像分類、目標(biāo)檢測、詞法分析、Transformer、情感分析五大類別。未來會持續(xù)開放更多類型的深度學(xué)習(xí)模型,如語言模型、視頻分類、圖像生成等預(yù)訓(xùn)練模型。
1.2 對比PytorchHub與PaddleHub
1.2.1 PytorchHub
GAN
PytorchHub
DCGAN on
FashionGen
PGAN
Speech
Tacotron2
WaveGlow
NLP
GPT
BERT
CV
SqueezeNet
Vgg-Nets
D
eeplabv3-ResNet101
ShuffleNetV2
NesnseNet
FCN-ResNet101
GoogLeNet
Incption_V3
MobileNetV2
ResNeXt
AlexNet
ResNet
GAN
PytorchHub
DCGAN on
FashionGen
PGAN
Speech
Tacotron2
WaveGlow
NLP
GPT
BERT
CV
SqueezeNet
Vgg-Nets
D
eeplabv3-ResNet101
ShuffleNetV2
NesnseNet
FCN-ResNet101
GoogLeNet
Incption_V3
MobileNetV2
ResNeXt
AlexNet
ResNet
1.2.2 PaddleHub
CV
resnet_v2_50_imagenet
ssd_mobilenet_v1_pascal
mobilenet_v2_imagenet
nasnet_imagenet
pnasnet_imagenet
resnet_v2_101_imagene
resnet_v2_152_imagenet
NLP
lac
bert
Chinese
Cased*2
uncased*2
multi_cased
ernie
senta_bilstm
emotion_detecdtion_textcnn
lexical_analysis
dureader_machine_reading
simnet_bow_pairwise
dmtk_models
sentiment_classification
dialogue
human
matchin
seq2seq
keywords
CV
resnet_v2_50_imagenet
ssd_mobilenet_v1_pascal
mobilenet_v2_imagenet
nasnet_imagenet
pnasnet_imagenet
resnet_v2_101_imagene
resnet_v2_152_imagenet
NLP
lac
bert
Chinese
Cased*2
uncased*2
multi_cased
ernie
senta_bilstm
emotion_detecdtion_textcnn
lexical_analysis
dureader_machine_reading
simnet_bow_pairwise
dmtk_models
sentiment_classification
dialogue
human
matchin
seq2seq
keywords
1.2.3 調(diào)用PaddleHub
目前PytorchHub不支持命令行運行,但PaddleHub支持,命令行運行就是指我們安裝PaddleHub后,可以無需進(jìn)入python環(huán)境,即可快速體驗PaddleHub無需代碼、一鍵預(yù)測的命令行功能。需要注意的是,在PaddleHub中,既可以支持命令行使用,即在終端輸入
hub run XXX(模型) --input_text XXX(需要預(yù)測的內(nèi)容)
1
也可以支持調(diào)用api
import paddlehub as hub hub.finetune_and_eval( task, data_reader, feed_list, config=None)
1
2
3
4
5
6
7
1.3 Model與Module
實際上,PaddleHub為Model和Module的管理和使用都提供了命令行工具,但是model和module是有區(qū)別的,一個是模型,一個是模塊。
model表示預(yù)訓(xùn)練好的參數(shù)和模型,當(dāng)需要使用Model進(jìn)行預(yù)測時,需要模型配套的代碼,進(jìn)行模型的加載,數(shù)據(jù)的預(yù)處理等操作后,才能進(jìn)行預(yù)測。我們在使用PaddleHub來調(diào)用模型時,可以使用hub download 命令獲取到最新的model再進(jìn)行實驗。module是model的一個可執(zhí)行模塊,簡單來說,一個Module可以支持直接命令行預(yù)測,也可以配合PaddleHub Finetune API,通過少量代碼實現(xiàn)遷移學(xué)習(xí)。 需要注意的是,不是所有的Module都支持命令行預(yù)測; (例如BERT/ERNIE Transformer類模型,一般需要搭配任務(wù)進(jìn)行finetune) 也不是所有的Module都可用于finetune(例如LAC詞法分析模型,我們不建議用戶用于finetune)
1.4 Fine-tune
PyTorchHub 不支持Fine-tune,PaddleHub支持。這一點倒是挺讓人意外的,如果通過hub加載了預(yù)訓(xùn)練模型,但是無法Fine-tune,那有什么意義呢?僅僅只是為了試試paper中的效果好不好嗎?本來我還對此頗有懷疑,于是去看了pytorchhub.org官網(wǎng)下的文檔,發(fā)現(xiàn)目前pytorchhub確實不支持hub一鍵式fine-tuning,現(xiàn)有模型的finetuning還是基于傳統(tǒng)的腳本式調(diào)參。
PaddleHub在Fine-tune這一塊做的很完善,在前一個板塊也給大家詳細(xì)舉了示例講解,在PaddleHub的官方gihub中,有非常詳細(xì)的Fine-tune教程,大家可以參考:
1.4.1 PaddleHub圖像分類遷移
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub圖像分類遷移教程
1
1.4.2 PaddleHub文本分類遷移
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分類遷移教程
1
總之,從這四個維度上,個人感覺PytorchHub更像一個小工具,幫助大家迅速試用一下開源的新模型,但是真正到實際應(yīng)用,還是要基于老的一套的fine-tuning,不能直接從hub里調(diào)用fine-tune的api,所以并不實用。對于遷移學(xué)習(xí)來說,F(xiàn)ine-tune是必不可少的,雖然我們有預(yù)訓(xùn)練的模型,但是新任務(wù)的場景和數(shù)據(jù)都不相同,直接使用預(yù)訓(xùn)練模型其實很難得到很好的效果,所以從工業(yè)級實用的角度來說,PaddleHub做的要更成熟一些,等稍后支持了用戶自定義上傳模型后大家可以多體驗體驗。
下
面,我們具體來看看PaddleHub如何直接使用命令行,調(diào)用一行代碼show出結(jié)果& 使用Finetune Api來對模型進(jìn)行微調(diào),并舉一個實例教大家一步一步實現(xiàn)。
2.1 PaddleHub安裝
環(huán)境依賴
Python==2.7 or Python>=3.5
PaddlePaddle>=1.4.0
安裝
pip install paddlehub
2.2 命令行快速體驗
安裝好后,不需要進(jìn)入python環(huán)境import就可以直接先體驗hub的便捷,因為在PaddleHub中hub可以作為一個獨立的模塊直接運行。PaddleHub目前包含圖像分類、目標(biāo)檢測、詞法分析、Transformer、情感分析五大類。
Usage: hub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
一行代碼預(yù)測:
分詞
# 使用百度詞法分析工具LAC進(jìn)行分詞 $ hub run lac --input_text "今天的你真好看" [{'tag': ['TIME', 'u', 'r', 'd', 'a'], 'word': ['今天', '的', '你', '真', '好看']}]
1
2
3
情感分析
# 使用百度Senta情感分析模型對句子進(jìn)行預(yù)測 $ hub run senta_bilstm --input_text "老鐵666,帶你開黑" [{'text': '老鐵666,帶你開黑', 'sentiment_key': 'positive', 'sentiment_label': 2, 'positive_probs': 0.7206, 'negative_probs': 0.2794}]
1
2
3
目標(biāo)檢測
#使用SSD檢測模型對圖片進(jìn)行目標(biāo)檢測 hub run ssd_mobilenet_v1_pascal --input_path test_img_bird.jpg
1
2
[{'data': [{'label': 'bird', 'confidence': 0.9935706853866577, 'left': 182.32740783691406, 'top': 110.21607208251953, 'right': 316.4570007324219, 'bottom': 228.32887268066406}, {'label': 'bird', 'confidence': 0.9861606359481812, 'left': 325.08056640625, 'top': 67.50239562988281, 'right': 454.9098815917969, 'bottom': 158.6644744873047}, {'label': 'bird', 'confidence': 0.9371040463447571, 'left': 76.58110809326172, 'top': 156.67181396484375, 'right': 148.7028350830078, 'bottom': 234.810546875}], 'path': 'work/1.jpg'}]
1
利用 輸出轉(zhuǎn)至將輸出檢測結(jié)果放置在text文件中。
import sys,os,math,time sys.path.append("/home/aistudio/external-libraries") import matplotlib.pyplot as plt from numpy import * !hub run ssd_mobilenet_v1_pascal --input_path work/1.jpg > work/1.txt
1
2
3
4
5
6
結(jié)果的內(nèi)容為:
with open(resultfile, 'r') as f: strall = f.readlines()[0] exec('data=%s'%strall) rect = data[0]['data'] print(type(rect), len(rect), shape(rect), rect)
1
2
3
4
5
6
1
2
3
4
img = cv2.imread(imgfile) for r in rect: title = '%s:%.4f'%(r['label'], r['confidence']) startpoint = (int(r['left']), int(r['top'])) endpoint = (int(r['right']), int(r['bottom'])) cv2.rectangle(img, startpoint, endpoint, (255, 255, 0), 1) cv2.putText(img, title, startpoint, fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=1, color=(255,0,0)) plt.clf() plt.figure(figsize=(12,12)) plt.axis("off") plt.imshow(img)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.3 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ù)測
# 單文本預(yù)測 hub run lac --input_text "今天是個好日子" # 多文本分析 hub run lac --input_file test.txt
1
2
3
4
CV預(yù)測
數(shù)據(jù)通過—input_path或—input_file導(dǎo)入來實現(xiàn)單次預(yù)測和批量預(yù)測
# 單張照片預(yù)測 hub run ssd_mobilenet_v1_pascal --input_path test.jpg # 多張照片預(yù)測 hub run ssd_mobilenet_v1_pascal --input_file test.txt
1
2
3
4
3.1 Fine-Tune
Fine-tune是遷移學(xué)習(xí)中使用最多的方式之一,通常我們可以在預(yù)訓(xùn)練好的模型上進(jìn)行微調(diào)來實現(xiàn)模型遷移,從而達(dá)到模型適應(yīng)新領(lǐng)域(Domain)數(shù)據(jù)的目的。上圖是做一個完整的遷移學(xué)習(xí)需要的步驟,下面舉個實例教大家如何用PaddleHub做圖像分類遷移學(xué)習(xí)
3.2 訓(xùn)練過程
3.2.1 準(zhǔn)備工作
安裝paddlepaddle和paddlehub
pip install paddlepaddle( 推薦安裝1.4.0版本以上) pip install paddlehub
1
2
3
3.2.2 選擇模型
此處使用經(jīng)典的ResNet-50作為預(yù)訓(xùn)練模型
import sys,os,math,time sys.path.append("/home/aistudio/external-libraries") import matplotlib.pyplot as plt from numpy import * import paddlehub as hub 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3.2.3 準(zhǔn)備數(shù)據(jù)
# 直接用PaddleHub提供的數(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)
1
2
3
4
5
6
7
3.2.4 Task
由于貓狗分類是一個二分類的任務(wù),而我們下載的分類module是在ImageNet數(shù)據(jù)集上訓(xùn)練的千分類模型,所以我們需要對模型進(jìn)行簡單的微調(diào),把模型改造為一個二分類模型:
1. 獲取module的上下文環(huán)境,包括輸入和輸出的變量,以及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]# 設(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())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.2.5 啟動Fine-Tune
可以選擇finetune_and_eval接口來進(jìn)行模型訓(xùn)練,這個接口在finetune的過程中,會周期性的進(jìn)行模型效果的評估,以便我們了解整個訓(xùn)練過程的性能變化。
訓(xùn)練過程中的性能數(shù)據(jù)會被記錄到本地,我們可以通過visualdl來可視化這些數(shù)據(jù)。我們在shell中輸入以下命令來啟動visualdl,其中${HOST_IP}為本機(jī)IP,需要用戶自行指定
$ visualdl --logdir ./cv_finetune_turtorial_demo/vdllog --host ${HOST_IP} --port 8989
1
啟動服務(wù)后,我們使用瀏覽器訪問${HOST_IP}:8989,可以看到訓(xùn)練以及預(yù)測的loss曲線和accuracy曲線
最后再按照常規(guī)流程對模型進(jìn)行預(yù)測即可。
● 相關(guān)圖表鏈接:
圖1.4.1 PytorchHub與PaddleHub對比
圖2.2.1 目標(biāo)檢測
圖2.2.2 標(biāo)注后處理的結(jié)果
圖2.4.1 Fine-tune全景圖
圖3.2 PaddleHub+FineTune流程圖
圖3.2.1 訓(xùn)練過程以及預(yù)測曲線
GitHub 機(jī)器學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。