來(lái)源:中國(guó)電商物流網(wǎng) 發(fā)布時(shí)間:2019-5-7 9:21
遷移學(xué)習(xí) (Transfer Learning) 是屬于深度學(xué)習(xí)的一個(gè)子研究領(lǐng)域,該研究領(lǐng)域的目標(biāo)在于利用數(shù)據(jù)、任務(wù)、或模型之間的相似性,將在舊領(lǐng)域?qū)W習(xí)過(guò)的知識(shí),遷移應(yīng)用于新領(lǐng)域中。遷移學(xué)習(xí)吸引了很多研究者投身其中,因?yàn)樗軌蚝芎玫慕鉀Q深度學(xué)習(xí)中的以下幾個(gè)問(wèn)題:
一些研究領(lǐng)域只有少量標(biāo)注數(shù)據(jù),且數(shù)據(jù)標(biāo)注成本較高,不足以訓(xùn)練一個(gè)足夠魯棒的神經(jīng)網(wǎng)絡(luò)
大規(guī)模神經(jīng)網(wǎng)絡(luò)的訓(xùn)練依賴(lài)于大量的計(jì)算資源,這對(duì)于一般用戶(hù)而言難以實(shí)現(xiàn)
應(yīng)對(duì)于普適化需求的模型,在特定應(yīng)用上表現(xiàn)不盡如人意
為了讓開(kāi)發(fā)者更便捷地應(yīng)用遷移學(xué)習(xí),百度 PaddlePaddle 開(kāi)源了預(yù)訓(xùn)練模型管理工具 PaddleHub。開(kāi)發(fā)者用使用僅僅十余行的代碼,就能完成遷移學(xué)習(xí)。本文將全面介紹 PaddleHub 及其應(yīng)用方法。
項(xiàng)目地址:https://github.com/PaddlePaddle/PaddleHub
PaddleHub 介紹
PaddleHub 是基于 PaddlePaddle 開(kāi)發(fā)的預(yù)訓(xùn)練模型管理工具,可以借助預(yù)訓(xùn)練模型更便捷地開(kāi)展遷移學(xué)習(xí)工作,旨在讓 PaddlePaddle 生態(tài)下的開(kāi)發(fā)者更便捷體驗(yàn)到大規(guī)模預(yù)訓(xùn)練模型的價(jià)值。
PaddleHub 目前的預(yù)訓(xùn)練模型覆蓋了圖像分類(lèi)、目標(biāo)檢測(cè)、詞法分析、Transformer、情感分析五大類(lèi)別。未來(lái)會(huì)持續(xù)開(kāi)放更多類(lèi)型的深度學(xué)習(xí)模型,如語(yǔ)言模型、視頻分類(lèi)、圖像生成等預(yù)訓(xùn)練模型。
圖 1 PaddleHub 功能全景
PaddleHub 主要包括兩個(gè)功能:命令行工具和 Fine-tune API。
命令行工具
PaddleHub 借鑒了 Anaconda 和 PIP 等軟件包管理的理念,開(kāi)發(fā)了命令行工具,可以方便快捷的完成模型的搜索、下載、安裝、預(yù)測(cè)等功能,對(duì)應(yīng)的關(guān)鍵的命令分別是 search,download,install,run 等。我們以 run 命令為例,介紹如何通過(guò)命令行工具進(jìn)行預(yù)測(cè)。
Run 命令用于執(zhí)行 Module 的預(yù)測(cè),這里分別舉一個(gè) NLP 和 CV 的例子。
對(duì)于 NLP 任務(wù):輸入數(shù)據(jù)通過(guò)--input_text 指定。以百度 LAC 模型(中文詞法分析)為例,可以通過(guò)以下命令實(shí)現(xiàn)單行文本分析。
對(duì)于 CV 任務(wù):輸入數(shù)據(jù)通過(guò)--input_path 指定。以 SSD 模型(單階段目標(biāo)檢測(cè))為例子,可以通過(guò)以下命令實(shí)現(xiàn)單張圖片的預(yù)測(cè)。
更多的命令用法,請(qǐng)讀者參考文首的 Github 項(xiàng)目鏈接。
Fine-tune API
PaddleHub 提供了基于 PaddlePaddle 實(shí)現(xiàn)的 Fine-tune API, 重點(diǎn)針對(duì)大規(guī)模預(yù)訓(xùn)練模型的 Fine-tune 任務(wù)做了高階的抽象,讓預(yù)訓(xùn)練模型能更好服務(wù)于用戶(hù)特定場(chǎng)景的應(yīng)用。通過(guò)大規(guī)模預(yù)訓(xùn)練模型結(jié)合 Fine-tune,可以在更短的時(shí)間完成模型的收斂,同時(shí)具備更好的泛化能力。
圖 2 PaddleHub Fine-tune API 全景
Fine-tune :對(duì)一個(gè) Task 進(jìn)行 Fine-tune,并且定期進(jìn)行驗(yàn)證集評(píng)估。在 Fine-tune 的過(guò)程中,接口會(huì)定期的保存 checkpoint(模型和運(yùn)行數(shù)據(jù)),當(dāng)運(yùn)行被中斷時(shí),通過(guò) RunConfig 指定上一次運(yùn)行的 checkpoint 目錄,可以直接從上一次運(yùn)行的最后一次評(píng)估中恢復(fù)狀態(tài)繼續(xù)運(yùn)行。
遷移任務(wù) Task:在 PaddleHub 中,Task 代表了一個(gè) Fine-tune 的任務(wù)。任務(wù)中包含了執(zhí)行該任務(wù)相關(guān)的 program 以及和任務(wù)相關(guān)的一些度量指標(biāo)(如分類(lèi)準(zhǔn)確率 accuracy、precision、 recall、 F1-score 等)、模型損失等。
運(yùn)行配置 RunConfig:在 PaddleHub 中,RunConfig 代表了在對(duì) Task 進(jìn)行 Fine-tune 時(shí)的運(yùn)行配置。包括運(yùn)行的 epoch 次數(shù)、batch 的大小、是否使用 GPU 訓(xùn)練等。
優(yōu)化策略 Strategy:在 PaddleHub 中,Strategy 類(lèi)封裝了一系列適用于遷移學(xué)習(xí)的 Fine-tune 策略。Strategy 包含了對(duì)預(yù)訓(xùn)練參數(shù)使用什么學(xué)習(xí)率變化策略,使用哪種類(lèi)型的優(yōu)化器,使用什么類(lèi)型的正則化等。
預(yù)訓(xùn)練模型 Module :Module 代表了一個(gè)可執(zhí)行的模型。這里的可執(zhí)行指的是,Module 可以直接通過(guò)命令行 hub run ${MODULE_NAME} 執(zhí)行預(yù)測(cè),或者通過(guò) context 接口獲取上下文后進(jìn)行 Fine-tune。在生成一個(gè) Module 時(shí),支持通過(guò)名稱(chēng)、url 或者路徑創(chuàng)建 Module。
數(shù)據(jù)預(yù)處理 Reader :PaddleHub 的數(shù)據(jù)預(yù)處理模塊 Reader 對(duì)常見(jiàn)的 NLP 和 CV 任務(wù)進(jìn)行了抽象。
數(shù)據(jù)集 Dataset:PaddleHub 提供多種 NLP 任務(wù)和 CV 任務(wù)的數(shù)據(jù)集,可供用戶(hù)載,用戶(hù)也可以在自定義數(shù)據(jù)集上完成 Fine-tune。
基于以上介紹的 PaddleHub 兩大功能,用戶(hù)可以實(shí)現(xiàn):無(wú)需編寫(xiě)代碼,一鍵使用預(yù)訓(xùn)練模型進(jìn)行預(yù)測(cè);通過(guò) hub download 命令,快速地獲取 PaddlePaddle 生態(tài)下的所有預(yù)訓(xùn)練模型;借助 PaddleHub Fine-tune API,使用少量代碼完成遷移學(xué)習(xí)。
以下將從實(shí)戰(zhàn)角度,教你如何使用 PaddleHub 進(jìn)行圖像分類(lèi)遷移。
PaddleHub 實(shí)戰(zhàn)
1. 安裝
PaddleHub 是基于 PaddlePaddle 的預(yù)訓(xùn)練模型管理框架,使用 PaddleHub 前需要先安裝 PaddlePaddle,如果你本地已經(jīng)安裝了 CPU 或者 GPU 版本的 PaddlePaddle,那么可以跳過(guò)以下安裝步驟。
推薦使用大于 1.4.0 版本的 PaddlePaddle。
通過(guò)以下命令來(lái)安裝 PaddleHub。
2. 選擇合適的模型
首先導(dǎo)入必要的 python 包
接下來(lái)我們要在 PaddleHub 中選擇合適的預(yù)訓(xùn)練模型來(lái) Fine-tune,由于貓狗分類(lèi)是一個(gè)圖像分類(lèi)任務(wù),因此我們使用經(jīng)典的 ResNet-50 作為預(yù)訓(xùn)練模型。PaddleHub 提供了豐富的圖像分類(lèi)預(yù)訓(xùn)練模型,包括了最新的神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索類(lèi)的 PNASNet,我們推薦你嘗試不同的預(yù)訓(xùn)練模型來(lái)獲得更好的性能。
3. 數(shù)據(jù)準(zhǔn)備
接著需要加載圖片數(shù)據(jù)集。為了快速體驗(yàn),我們直接加載 PaddleHub 提供的貓狗分類(lèi)數(shù)據(jù)集,如果想要使用自定義的數(shù)據(jù)進(jìn)行體驗(yàn),請(qǐng)查看自定義數(shù)據(jù)。
4. 自定義數(shù)據(jù)
本節(jié)說(shuō)明如何組裝自定義的數(shù)據(jù),如果想使用貓狗數(shù)據(jù)集進(jìn)行體驗(yàn),可以直接跳過(guò)本節(jié)。使用自定義數(shù)據(jù)時(shí),我們需要自己切分?jǐn)?shù)據(jù)集,將數(shù)據(jù)集且分為訓(xùn)練集、驗(yàn)證集和測(cè)試集。
同時(shí)使用三個(gè)文本文件來(lái)記錄對(duì)應(yīng)的圖片路徑和標(biāo)簽,此外還需要一個(gè)標(biāo)簽文件用于記錄標(biāo)簽的名稱(chēng)。
訓(xùn)練/驗(yàn)證/測(cè)試集的數(shù)據(jù)列表文件的格式如下
標(biāo)簽列表文件的格式如下
使用如下的方式進(jìn)行加載數(shù)據(jù),生成數(shù)據(jù)集對(duì)象
注意事項(xiàng):
1、num_labels 要填寫(xiě)實(shí)際的分類(lèi)數(shù)量,如貓狗分類(lèi)該字段值為 2,food101 該字段值為 101,下文以 2 為例子
2、base_path 為數(shù)據(jù)集實(shí)際路徑,需要填寫(xiě)全路徑,下文以/test/data 為例子
3、訓(xùn)練/驗(yàn)證/測(cè)試集的數(shù)據(jù)列表文件中的圖片路徑需要相對(duì)于 base_path 的相對(duì)路徑,例如圖片的實(shí)際位置為/test/data/dog/dog1.jpg,base_path 為/test/data,則文件中填寫(xiě)的路徑應(yīng)該為 dog/dog1.jpg
5. 生成 Reader
接著生成一個(gè)圖像分類(lèi)的 reader,reader 負(fù)責(zé)將 dataset 的數(shù)據(jù)進(jìn)行預(yù)處理,接著以特定格式組織并輸入給模型進(jìn)行訓(xùn)練。
當(dāng)我們生成一個(gè)圖像分類(lèi)的 reader 時(shí),需要指定輸入圖片的大小
6. 組建 Fine-tune Task
有了合適的預(yù)訓(xùn)練模型和準(zhǔn)備要遷移的數(shù)據(jù)集后,我們開(kāi)始組建一個(gè) Task。
由于貓狗分類(lèi)是一個(gè)二分類(lèi)的任務(wù),而我們下載的 cv_classifer_module 是在 ImageNet 數(shù)據(jù)集上訓(xùn)練的千分類(lèi)模型,所以我們需要對(duì)模型進(jìn)行簡(jiǎn)單的微調(diào),把模型改造為一個(gè)二分類(lèi)模型:
1、獲取 cv_classifer_module 的上下文環(huán)境,包括輸入和輸出的變量,以及 Paddle Program;
2、從輸出變量中找到特征圖提取層 feature_map;
3、在 feature_map 后面接入一個(gè)全連接層,生成 Task;
7. 選擇運(yùn)行時(shí)配置
在進(jìn)行 Fine-tune 前,我們可以設(shè)置一些運(yùn)行時(shí)的配置,例如如下代碼中的配置,表示:
use_cuda:設(shè)置為 False 表示使用 CPU 進(jìn)行訓(xùn)練。如果本機(jī)支持 GPU,且安裝的是 GPU 版本的 PaddlePaddle,我們建議你將這個(gè)選項(xiàng)設(shè)置為 True;
epoch:要求 Fine-tune 的任務(wù)只遍歷 1 次訓(xùn)練集;
batch_size:每次訓(xùn)練的時(shí)候,給模型輸入的每批數(shù)據(jù)大小為 32,模型訓(xùn)練時(shí)能夠并行處理批數(shù)據(jù),因此 batch_size 越大,訓(xùn)練的效率越高,但是同時(shí)帶來(lái)了內(nèi)存的負(fù)荷,過(guò)大的 batch_size 可能導(dǎo)致內(nèi)存不足而無(wú)法訓(xùn)練,因此選擇一個(gè)合適的 batch_size 是很重要的一步;
log_interval:每隔 10 step 打印一次訓(xùn)練日志;
eval_interval:每隔 50 step 在驗(yàn)證集上進(jìn)行一次性能評(píng)估;
checkpoint_dir:將訓(xùn)練的參數(shù)和數(shù)據(jù)保存到 cv_Fine-tune_turtorial_demo 目錄中;
strategy:使用 DefaultFine-tuneStrategy 策略進(jìn)行 Fine-tune;
更多運(yùn)行配置,請(qǐng)查看文首的 Github 項(xiàng)目鏈接。
8. 開(kāi)始 Fine-tune
我們選擇 Fine-tune_and_eval 接口來(lái)進(jìn)行模型訓(xùn)練,這個(gè)接口在 Fine-tune 的過(guò)程中,會(huì)周期性的進(jìn)行模型效果的評(píng)估,以便我們了解整個(gè)訓(xùn)練過(guò)程的性能變化。
9. 查看訓(xùn)練過(guò)程的效果
訓(xùn)練過(guò)程中的性能數(shù)據(jù)會(huì)被記錄到本地,我們可以通過(guò) visualdl 來(lái)可視化這些數(shù)據(jù)。
我們?cè)?shell 中輸入以下命令來(lái)啟動(dòng) visualdl,其中${HOST_IP} 為本機(jī) IP,需要用戶(hù)自行指定
啟動(dòng)服務(wù)后,我們使用瀏覽器訪問(wèn)${HOST_IP}:8989,可以看到訓(xùn)練以及預(yù)測(cè)的 loss 曲線和 accuracy 曲線,如下圖所示。
10. 使用模型進(jìn)行預(yù)測(cè)
當(dāng) Fine-tune 完成后,我們使用模型來(lái)進(jìn)行預(yù)測(cè),整個(gè)預(yù)測(cè)流程大致可以分為以下幾步:
1、構(gòu)建網(wǎng)絡(luò)
2、生成預(yù)測(cè)數(shù)據(jù)的 Reader
3、切換到預(yù)測(cè)的 Program
4、加載預(yù)訓(xùn)練好的參數(shù)
5、運(yùn)行 Program 進(jìn)行預(yù)測(cè)
通過(guò)以下命令來(lái)獲取測(cè)試的圖片(適用于貓狗分類(lèi)的數(shù)據(jù)集)
注意:其他數(shù)據(jù)集所用的測(cè)試圖片請(qǐng)自行準(zhǔn)備。
完整預(yù)測(cè)代碼如下:
關(guān)注ITBear科技資訊公眾號(hào)(itbear365 ),每天推送你感興趣的科技內(nèi)容。
特別提醒:本網(wǎng)內(nèi)容轉(zhuǎn)載自其他媒體,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。本站不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。如若本網(wǎng)有任何內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系我們,本站將會(huì)在24小時(shí)內(nèi)處理完畢。