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