飛槳深度學習集訓營學習心得

2021-10-03 08:59:05 字數 3404 閱讀 8996

sky在這個特殊的寒假中,偶然加入到了飛槳深度學習集訓營的學習隊伍中。在這裡較為系統的學習到了很多深度學習、計算機視覺方面的知識,還入門了paddle框架的使用方法,相信即使是具有一定深度學習經驗的同學,也會不小的收穫。在cv部分課程結束的時候參加了集訓營的小比賽,得到了滿意的成績。

從一年多前開始,就聽聞過paddle框架,在2023年的「waic·開發者論壇」上更是近距離學習了來自paddle團隊成員關於核心架構與實戰應用的報告,這一次終於能比較系統的入門paddle。首先,想簡單說一下使用paddle的體驗和感受,以及與其他框架的一些對比。

在使用paddle之前,先後接觸過tensorflow、pytorch這些框架,當時的tensorflow使用的是靜態圖模型,必須先定義好graph,然後通過feed對graph饋入資料和標籤。個人感覺純靜態圖模型的程式設計方式入門難度相對比較高,而且與python這種動態解釋語言的設計哲學是相悖的。其次,在tf下寫乙個好的pipeline(cpu、gpu非同步處理資料,充分的裝置利用率)對普通使用者的難度較大,靜態圖理論上是效率更優的,但是普通使用者未必能充分發揮其能力,甚至效率可能不如其他動態圖框架。

作為動態圖框架,pytorch的思想與程式設計方式都非常的pythonic,docs的內容也很詳盡,許多地方都附上了簡明的公式,非常適合學習。但部署一直是pytorch廣為詬病的短板,很久以來都缺少端到端的高效部署方案。

paddle作為後起之秀吸收了前人的經驗。首先,paddle是同時支援靜態圖和動態圖的,paddle很多op都封裝進了paddle.fluid當中,文件內容比較豐富,許多地方會貼出相關學術**的位址,方便深入學習。其次,paddle帶有大量的官方模型庫,以做影象方面相關的研究為例,paddlecv中給出了主流分類網路的靜態圖網路以及benchmark,paddledetection中給出了主流檢測網路的靜態圖以及benchmark。最後但也是很重要的一點,paddle支援端到端部署,推理引擎非常高效。

課程雖然不長,但是乾貨滿滿,加上與老師同學的交流,學習到了很多,這裡結合paddle框架談一談學習到的一些cv知識與經驗。(限於個人學識經驗,可能存在不嚴謹之處,以下內容還請批判的看)

乙個深度學習任務大概分為資料分析、預處理、網路設計、訓練、結果分析、推理部署6部分。

了解資料規模,ground truth的數量大概可以支撐多大的網路;

如果涉及多類別,檢查各類別ground

truth的比例,考慮是否用重取樣等方法平衡類別;

合理劃分train/validate資料,確保兩者資料分布相近;

視覺化label,檢查標註是否合理,清洗髒資料;

觀察資料特點,必要時需要領域知識(如醫學影象),合理安排預處理和網路;

基於ground truth bbox聚類調整anchor尺寸(針對anchor-base的網路)。

以本次「ai識蟲」資料為例:

**在這裡

針對不同資料特點,可以對影象進行去噪、去除無關區域和資料增廣等操作,最多的操作就是資料增廣。深度學習的本質是引數對資料的擬合,隨著網路加深,模型的表達能力得到提高,但引數數量也會隨之增加。在定量的資料下,網路的深度必定有乙個平衡點。

乙個自然的思路就是增加資料。隨意資料增廣可能引入噪音,增廣必須基於資料集特點,將資料想象成高維空間的點,增廣出來的資料必須大致落在原來資料集(可能的)分布曲面上(覆蓋問題空間)。

以本次「ai識蟲」為例:

資料大致上是由垂直向下的相機在固定場景下拍攝的在7種昆蟲在不同位置、不同角度的**。

其次背景純淨,可以使用mix up增強擴增出bbox部分交疊的情況;

最後,相機應該是採用自動**/自動對焦/自動白平衡模式,所以導致總體相片的色調不一致,部分**也出現失焦,採用亮度對比度飽和度抖動可以擴增出色調不一致的情況,隨機模糊也能模擬出失焦。

帶gt bbox的旋轉可能出現邊界不准的情況,可以通過bbox面積與旋轉角度對邊界進行調整;也可以對每個物體使用閾值化等方法確定每個新bbox的精確邊界。

此外,增廣的方法還有非常多,如cutout、crop、multi-scale training/testing、coarse

dropout、cut mix、sample pairing,還有基於rl對增廣的探索方法等。

自行搭建網路一開始往往效果不理想,建議從paddlecv或者paddledetection提供的網路入手。每種網路的訓練方法和適用範圍可能不同,建議閱讀相關的*****之後再用。

如果選擇採用單階段做目標檢測問題,可以直接從paddlecv的分類網路出發,自己新增bbox回歸分支,如此靈活性可以大大提高。

如果選擇一些流行的網路,可以獲取到預訓練模型,基於大資料集的預訓練模型往往可以得到更好的效果。

訓練要注意速度和精度,不同的編碼方式可能帶來極大的效率差異。

paddle支援分布式/多gpu,自己從頭編寫的**呼叫paddle.distributed.launch也可以實現資料並行。這點老師在「2-7【手寫數字識別】之多gpu訓練」中有提及;

使用fluid.io.dataloader非同步資料讀取而不用同步feed的方式,實現資料讀取和模型訓練非同步並行的進行。這在io速度低或預處理耗時的場景下可以大大減少網路每個epoch等待資料饋入的時間。

靜態圖效率一般比動態圖高,也可以混合用。使用paddle.fluid.compiler對graph進行編譯後,可以開啟記憶體/視訊記憶體優化,提高訓練效率。靜態圖/動態圖/兩者混合都可以編譯。

個人經驗,一般來說,幾種優化器在收斂速度上,adam>momentum>sgd,收斂效果視情況而異。

可以嘗試piecewise_decay以外的學習率規劃方案;

實驗新網路時不要過早的加入正則化;

巨集觀的,對每種類別繪製出val分數曲線,如ap(30、50、70)、ar、fp、fn;

微觀的,繪製出每張test的infer結果;

根據分數與視覺化結果對訓練集分布、網路結構、學習策略等做出微調。

訓練最終模型時不要忘記加入驗證集。

作為一款優秀的國產開源深度學習框架,paddle超出了我的預料。在今後的科研與工作中,會將飛槳作為主要的開發工具之一。我的研究生專業是資訊與訊號處理,研究方向是自動化的異常訊號檢測,平時基於興趣,會做比較多影象相關的個人專案。相信基於paddle開發,不僅可以提高開發效率,還可以實現端到端的部署,省去大量的裝置適配的時間。

接下來,我會繼續探索paddle在cv、nlp方面的應用,閱讀官方docs、閱讀相關*****嘗試新的網路結構與訓練方法、逐步構建自己針對不同問題的pipeline。課程告一段落,但新的征程才剛剛開始!在下個學期,可能也會嘗試深度強化學習框架parl,利用強化學習技術去做一些有趣的事情:)

最後,非常感謝飛槳深度學習集訓營的畢老師、孫老師、班主任老師、小助手,帶來如此精彩有趣的課程,衷心祝願飛槳深度學習集訓營越辦越好!

2023年2月29日

paddlepaddle百度飛槳學習心得

還有詳細的安裝模組講解,簡單案例,經典案例,高階內容等等 然後是專案裡自己最近嘗試修改過的部分 1.資料打亂 老師提供的案例是先得到訓練集資料的索引,然後將索引打亂,從而達到打亂訓練集資料的目的。打亂訓練集資料的原因是 網路對最近得到的資料的印象較深,除非特殊任務本身對日期等有限制,都會事先打亂訓練...

飛槳開源深度學習(一)

一些問題q 深度學習 我們可以很容易理解,即機器學習中人工智慧的乙個研究方面 機器學習 人工智慧 深度學習 而這裡的框架,實際上就是指乙個平台,在這個平台中,我們程式設計師只需要考慮一小部分函式實現,而其他的系統層面的細節均有平台自動處理,不需要程式設計師顧慮擔心。所以,學習深度學習,我們能用較小的...

深度學習心得

從2019年3月份開始學習深度學習,目前也有9個月的時間了,中間由於工作原因也停過一段時間。邏輯回歸和線性回歸區別 簡單來說,邏輯回歸就是解決分類問題,線性回歸就是解決線性問題,線性回歸是連續的值的輸出,而邏輯回歸主要是實現的是1和0的分類問題。矩陣的知識 1 矩陣點乘 各元素逐一相乘,兩個矩陣調換...