DeepAugment是一個專一於數據擴充的自動化工具。 它利用貝葉斯優化來發現針對您的圖像數據集定製的數據加強策略。 DeepAugment的主要優勢和特色是:html
完成的包在PyPI上。你能夠經過運行如下命令來在終端上安裝它:git
$ pip install deepaugment
你也能夠訪問項目的自述文件或運行谷歌Colab筆記本教程。要想了解更多關於我是如何構建這個的,請繼續閱讀!github
數據是人工智能應用中最關鍵的部分。沒有足夠的標記數據經常致使過分擬合,這意味着模型將沒法概括爲未發現的示例。這能夠經過數據擴充來緩解,數據擴充能夠有效地增長網絡所看到的數據的數量和多樣性。它是經過對原始數據集(如旋轉、裁剪、遮擋等)應用轉換,人爲地生成新數據來實現的。然而,肯定哪一種加強對手頭的數據集最有效並非一項簡單的任務。爲了解決這個問題,谷歌去年發佈了AutoAugment,它經過使用強化學習發現了給定數據集的優化加強。
因爲強化學習模塊的存在,使用谷歌的AutoAugment須要強大的計算資源。因爲得到所需的計算能力代價高昂,所以我開發了一種新的方法——DeepAugment,它使用貝葉斯優化而不是強化學習。算法
努力改進數據質量一般比努力改進模型得到更高的投資回報。改進數據有三種主要方法:收集更多的數據、合成新數據或擴展示有數據。收集額外的數據並不老是可行的,並且可能很昂貴。GANs所作的數據合成是頗有前途的,但也很複雜,可能與實際的例子有所不一樣。bash
另外一方面,數據擴充簡單且影響很大。它適用於大多數數據集,並經過簡單的圖像轉換完成。然而,問題是肯定哪一種加強技術最適合當前的數據集。發現正確的方法須要耗時的實驗。即便通過屢次實驗,機器學習(ML)工程師仍然可能找不到最佳選擇。
對於每一個圖像數據集,有效的加強策略是不一樣的,一些加強技術甚至可能對模型有害。例如,若是使用MNIST digits數據集,應用旋轉會使模型變得更糟,由於在「6」上180度旋轉會使它看起來像「9」,而仍然被標記爲「6」。另外一方面,對衛星圖像應用旋轉能夠顯著改善結果,由於不管旋轉多少次,從空中拍攝的汽車圖像仍然是一輛汽車。網絡
DeepAugment旨在做爲一種快速靈活的autoML數據擴充解決方案。更具體地說,它被設計爲AutoAugment的更快和更靈活的替代品。(2018年Cubuk等人的博客)AutoAugment是2018年最使人興奮的發佈之一,也是第一種使用強化學習來解決這一特定問題的方法。在本文發表時,AutoAugment的開源版本沒有提供控制器模塊,這阻礙了用戶爲本身的數據集使用它。此外,學習加強策略須要15,000次迭代,這須要巨大的計算資源。即便源代碼徹底可用,大多數人也沒法從中受益。
deepaugmented經過如下設計目標來解決這些問題:
1.在保證結果質量的前提下,最小化數據擴充優化的計算複雜度。
2.模塊化和人性化。
爲了實現第一個目標,與AutoAugment相比,DeepAugment的設計具備如下差別:app
爲了實現第二個目標,即便DeepAugment模塊化和人性化,用戶界面的設計方式爲用戶提供了普遍的可能性配置和模型選擇(例如,選擇子模型或輸入自設計的子模型,請參閱配置選項)。機器學習
DeepAugment旨在爲給定的圖像數據集找到最佳的擴充策略。加強策略被定義爲五個子策略的總和,這兩個子策略由兩種類型的加強技術和兩個實值[0,1]組成,決定了每種加強技術的應用能力。我使用imgaug包實現了加強技術,imgaug包以其大量的加強技術(見下文)而聞名。ide
當多樣化和隨機應用時,加強是最有效的。例如,與其旋轉每一個圖像,不如旋轉圖像的某些部分,剪切另外一部分,而後對另外一部分應用顏色反轉。基於這一觀察,Deepaugment對圖像隨機應用五個子策略之一(包括兩個加強)。優化過程當中,每一個圖像被五個子策略之一加強的機率(16%)相等,而徹底不被加強的機率爲20%。
雖然這個策略設計受到了autoaugmented的啓發,但有一個主要的區別:我沒有使用任何參數來應用子策略的機率,以便使策略的隨機性更低,並容許在更少的迭代中進行優化。模塊化
這個策略設計爲貝葉斯優化器建立了一個20維的搜索空間,其中10個維度是分類(加強技術的類型),其餘10個維度是實值(大小)。因爲涉及到分類值,我將貝葉斯優化器配置爲使用隨機森林估計器。
DeepAugment的三個主要組件是控制器(貝葉斯優化器),加強器和子模型,整個工做流程以下:控制器採樣新的加強策略,加強器按新策略轉換圖像,子模型是經過加強圖像從頭開始訓練。
根據子模型的訓練歷史計算獎勵。獎勵返回給控制器,控制器使用此獎勵和相關的加強策略更新代理模型(請參閱下面的「貝葉斯優化如何工做」一節)。而後控制器再次採樣新策略,並重復相同的步驟。此過程循環,直到達到用戶肯定的最大迭代次數。
控制器(貝葉斯優化器)是使用scikit- optimization庫的ask-and-tell方法實現的。它被配置爲使用一個隨機森林估計器做爲其基本估計器,並指望改進做爲其獲取函數。
DeepAugment的基本工做流程
貝葉斯優化的目的是找到一組最大化目標函數值的參數。 貝葉斯優化的工做循環能夠歸納爲:
1.創建目標函數的代理模型
2.查找代理上執行得最好的參數
3.使用這些參數執行目標函數
4.使用這些參數和目標函數的得分更新代理模型
5.重複步驟2-4,直到達到最大迭代次數
有關貝葉斯優化的更多信息,請閱讀高級的這篇解釋的博客,或者看一下這篇綜述文章。
貝葉斯優化的二維描述,其中x和y軸表示加強類型,點(i,j)處的顏色表示用加強i和j所加強的數據進行訓練時CNN模型的精度。
目前用於超參數優化的標準方法有隨機搜索、網格搜索、貝葉斯優化、進化算法和強化學習,按方法複雜度排序。在超參數優化的精度、成本和計算時間方面,貝葉斯優化優於網格搜索和隨機搜索(參見這裏的經驗比較)。這是由於貝葉斯優化從先前參數的運行中學習,與網格搜索和隨機搜索相反。
當貝葉斯優化與強化學習和進化算法進行比較時,它提供了具備競爭力的準確性,同時須要更少的迭代。例如,爲了學習好的策略,谷歌的AutoAugment迭代15,000次(這意味着訓練子CNN模型15,000次)。另外一方面,貝葉斯優化在100-300次迭代中學習良好的策略。貝葉斯優化的經驗法則是使迭代次數等於優化參數的次數乘以10。
超參數優化方法的直觀比較。經過比較類別,加號(+)的數量表示該方法有多好。
挑戰1:優化加強須要大量的計算資源,由於子模型應該從頭開始反覆訓練。大大減慢了個人工具的開發過程。 儘管使用貝葉斯優化使其更快,但優化過程仍然不夠快,沒法使開發變得可行。
對策:我開發了兩種解決方案。首先,我優化了子CNN模型(見下圖),這是該過程的計算瓶頸。其次,我以更肯定的方式設計了加強策略,使貝葉斯優化器須要更少的迭代。
設計子CNN模型。它在AWS p3.2x大型實例(帶有112 TensorFLOPS的Tesla V100 GPU)上以32x32圖像在約30秒(120個週期)的時間內完成培訓。
挑戰2:我在DeepAugment的開發過程當中遇到了一個有趣的問題。在經過一遍又一遍地訓練子模型來優化加強期間,它們開始過分擬合驗證集。當我更改驗證集時,我發現的最佳策略表現不佳。這是一個有趣的例子,由於它不一樣於通常意義上的過分擬合,即模型權重過分擬合數據中的噪聲。
對策:我沒有使用相同的驗證集,而是將剩餘的數據和訓練數據保留爲「種子驗證集」,並在每次子CNN模型訓練時對1000個圖像的驗證集進行採樣(參見下面的數據管道)。這解決了加強過分擬合問題。
DeepAugment發佈在PyPI上。你能夠經過運行如下命令來在終端安裝它:
$ pip install deepaugment
而且使用方便:
from deepaugment.deepaugment import DeepAugment deepaug = DeepAugment(my_images, my_labels) best_policies = deepaug.optimize()
經過配置DeepAugment,能夠得到更高級的用法:
from keras.datasets import cifar10 # my configuration my_config = { "model": "basiccnn", "method": "bayesian_optimization", "train_set_size": 2000, "opt_samples": 3, "opt_last_n_epochs": 3, "opt_initial_points": 10, "child_epochs": 50, "child_first_train_epochs": 0, "child_batch_size": 64 } (x_train, y_train), (x_test, y_test) = cifar10.load_data() # X_train.shape -> (N, M, M, 3) # y_train.shape -> (N) deepaug = DeepAugment(x_train, y_train, config=my_config) best_policies = deepaug.optimize(300)
有關更詳細的安裝/使用信息,請訪問項目的自述文件或運行Google Colab筆記本教程。
據咱們所知,DeepAugment是第一種利用貝葉斯優化來尋找最佳數據加強的方法。 數據加強的優化是最近的一個研究領域,AutoAugment是解決這一問題的首批方法之一。
Deepaugment對開源社區的主要貢獻在於它使進程具備可擴展性,容許用戶在不須要大量計算資源的狀況下優化擴充策略*。它是很是模塊化的,比之前的解決方案AutoAugment快50倍以上。
WideResNet-28-10 CNN模型與CIFAR10圖像在被Deepaugment發現的策略加強和不加強時的驗證精度比較驗證精度提升8.5%,至關於減小了60%的偏差。
結果代表,使用CIFAR-10小圖像數據集的WideResNet-28-10模型與不使用加強的模型和數據集相比,Deepaugment能夠減小60%的偏差。
Deepaugment目前只優化圖像分類任務的加強。它能夠擴展到優化對象檢測或分割任務,若是你願意,我歡迎你的貢獻。可是,我認爲最好的加強策略很是依賴於數據集的類型,而不是任務(例如分類或對象檢測)。這意味着不管任務是什麼,AutoAugment都應該找到相似的策略,但若是這些策略最終變得很是不一樣,那將是很是有趣的!
雖然DeepAugment目前適用於圖像數據集,但將其擴展到文本、音頻或視頻數據集將很是有趣。一樣的概念也適用於其餘類型的數據集。
*使用AWS P3.X2Large實例,DeepAugment在CIFAR-10數據集上花費4.2小時(500次迭代),成本約爲13美圓。
我在Insight人工智能研究員計劃期間的三個星期內完成了這個項目。我感謝程序總監Matt Rubashkin和Amber Roberts的很是有用的指導,感謝個人技術顧問Melissa Runfeldt幫助我解決問題。我感謝Amber Roberts,Emmanuel Ameisen,Holly Szafarek和Andrew Forrester在這篇博客文章中提出的建議和編輯工做。
想要提高你在數據科學和人工智能領域的職業生涯?申請SV和NYC的截止日期是4月1日!在Insight瞭解更多關於人工智能程序的信息!
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。