20美元/小時的AutoML很肉疼?快來入門免費的Auto-Keras!
谷歌 AutoML 的出現使得普通深度學習從業者也能以最少的領域知識來訓練模型,但這項服務每小時收費 20 美元,是不是很肉疼?所幸,AutoKeras 為廣大從業者帶來了福音。這種開源 Python 包為昂貴的 AutoML 提供了免費替代品,它所有的程式碼都是開源的!本文作者將介紹如何用 Auto-Keras 進行自動化的機器學習和深度學習。
當深度學習從業人員在資料集上訓練神經網路時,他們主要有兩個目標:
-
定義符合資料集特性的神經網路架構。
-
在許多試驗中對一組 超引數 進行調優,從而使得模型具有較高的準確率並且能夠泛化至訓練集和測試集之外的資料。舉例而言,需要進行調優的典型引數包括優化器演算法(隨機梯度下降,Adam 等)、學習率、學習率排程以及正則化方法。
針對不同的資料集和問題,深度學習專家需要進行幾十至上百次的實驗才能找到神經網路架構和 超引數 之間的平衡。
這些實驗可能需要在 GPU 上花費幾百到上千小時的計算時間。
這樣的情況還只是對於深度學習專家來說,那麼對於那些普通的深度學習從業者來說又將如何呢?
下面來看看 Auto-Keras 和 AutoML 這兩種工具吧:
Auto-Keras 和 AutoML 的最終目的都是通過使用自動化的神經架構搜尋(NAS)演算法減少展開機器學習和深度學習工作的障礙。
Auto-Keras 和 AutoML 使非深度學習專家能夠以最少的領域知識(深度學習或實際資料)來訓練其模型。
通過 AutoML 和 Auto-Keras,一個具備最少機器學習專業知識的程式設計師也可以應用這些演算法,以最少的努力達到最佳水準。
那麼,如果你想知道為什麼,請繼續閱讀下文。
想了解更多的關於 AutoML 的資訊(以及如何使用 Auto-Keras 自動訓練神經網路並進行調優),也請繼續讀下去。
Auto-Keras 和 AutoML:入門指南
接下來,我們將先討論自動化機器學習(AutoML)以及神經架構搜尋(NAS)演算法,NAS 使我們可以將 AutoML 應用於神經網路和深度學習。
我們還將簡要地討論谷歌 AutoML,這是一套工具和程式庫,它使機器學習專業知識有限的程式設計師能夠在其資料上訓練出具備高準確率的模型。
當然,谷歌的 AutoML 是一種專有演算法(也有點小貴)。
AutoML 的一種替代方案是開源的 Auto-Keras,它是在 Keras 和 PyTorch 的基礎上構建的。
我們將向讀者展示如何用 Auto-Keras 自動訓練神經網路,並對其進行評估。
什麼是自動化機器學習(AutoML)?
圖 1:Auto-Keras 是谷歌 AutoML 的替代方案。這些軟體專案可以幫助你在很少干預的情況下自動訓練模型。對於從事深度學習工作的新手來說,它們是很好的備選方案。
除了無監督學習(從無標籤資料中自動學習模式),對於非專家從業者來說,自動化機器學習一直是一個夢想。
想象一下通過以下方法自動建立機器學習模型:
-
安裝一個程式庫/使用一個 web 介面
-
將程式庫/介面指向資料
-
自動在資料上訓練模型,無需調整引數/深入瞭解驅動它的演算法
有些公司正試圖建立這樣的解決方案——谷歌 AutoML 就是其中一支重要的力量。
谷歌 AutoML 使機器學習經驗非常有限的開發者和工程師們能夠在自己的資料集上自動訓練神經網路。
在谷歌 AutoML 框架下,將進行如下的演算法迭代:
-
在一個訓練集上訓練一個網路
-
在一個測試集上評估上一步訓練出的網路
-
修正神經網路架構
-
對 超引數 調優
-
重複以上過程
使用 AutoML 的程式設計師或工程師無需定義其神經網路架構或對 超引數 調優——AutoML 會自動幫他們完成這些工作。
神經架構搜尋(NAS)使得 AutoML 成為可能
圖 2:圖中總結了神經架構搜尋(NAS)生成一個網路模型的過程,上圖中,這些網路正在搜尋適用於 CIFAR-10 資料集的最佳 CNN 架構。(圖源:《Learning Transferable Architectures for Scalable Image Recognition》圖 4)
谷歌 AutoML 和 Auto-Keras 都是由神經架構搜尋(NAS)演算法驅動的。給定輸入資料集,NAS 演算法將自動搜尋最優的網路架構以及相應的引數。
本質上來說,NAS 就是用一套能夠自動對模型進行調優的演算法替代了深度學習工程師/從業者!
在計算機視覺和影象識別的任務中,神經架構搜尋演算法將:
-
接收輸入的訓練資料集
-
優化並找到稱為「cells」的架構構建模組,這些 cells 是 NAS 自動習得的,看起來可能類似於 Inception 網路、殘差網路或 squeeze/fire 網路微型架構
-
持續訓練並搜尋「NAS 搜尋空間」,尋找更優的單元結構
如果 AutoML 系統的使用者是經驗豐富的深度學習從業者,那他們可以選擇:
-
在比訓練資料集小得多的子集上執行 NAS
-
找到一組最優的架構構建模組/單元
-
使用這些單元並在架構搜尋過程中手動定義一個更深版本的網路
-
利用其專業知識和實踐經驗在完整的訓練集上訓練網路
這種方法結合了完全自動化機器學習解決方案和需要專業深度學習從業者參與的方法,它的準確率通常比 NAS 自己發現的網路架構方法更高。
如果你想了解這些演算法的工作細節,可以閱讀兩篇論文:《Neural Architecture Search with Reinforcement Learning》和《Learning Transferable Architectures for Scalable Image Recognition》
Auto-Keras:谷歌 AutoML 的開源替代方案
圖 3:Auto-Keras 程式包由德州農工大學的「DATA Lab」團隊開發。
由德州農工大學「DATA Lab」團隊開發的 Auto-Keras 程式包是谷歌 AutoML 的一種替代方案。Auto-Keras 也使用了神經架構搜尋技術,但是應用了「網路態射」(network morphism,在改變網路架構的同時保持網路所具備的功能),並使用貝葉斯優化引導網路態射,以實現更高效的神經網路搜尋。
你可以在 Jin 等人 2018 年發表的論文《Auto-Keras: Efficient Neural Architecture Search with Network Morphism》中找到更多關於 Auto-Keras 框架的技術細節。
專案結構
接下來,你可以從本文的「Downloads」部分下載所需程式碼的壓縮包,然後解壓檔案,並通過終端導航至解壓的資料夾。
我們可以用「tree」命令檢視專案結構:
$ tree --dirsfirst . ├── output │├── 14400.txt │├── 28800.txt │├── <mark data-type="institutions" data-id="e6402476-9c73-4340-b0c8-2b470157ce64">360</mark>0.txt │├── 43200.txt │├── 7200.txt │└── 86400.txt └── train_auto_keras.py 1 directory, 7 files }
接下來,我們將以 Python 指令碼「train_auto_keras.py」為例展開討論。
因為會有很多執行結果輸出到螢幕上,所以我們選擇將分類報告(在 scikit-learn 的「classification_report」工具的幫助下生成)作為文字檔案儲存到磁碟上。檢視上圖所示的「output」/資料夾,可以看到一些已經生成的報告。你可以列印一個報告到終端對話方塊中(例如,cat output/14400.txt),看看執行結果如何。
安裝 Auto-Keras
圖 4:Auto-Keras 程式包依賴於上圖所示的 Python 3.6、TensorFlow以及 Keras。
根據 Github 程式碼庫中的描述,Auto-Keras 目前還處於「預釋出」狀態,也就是說它還沒有正式釋出。
其次,Auto-Keras 需要 Python 3.6,並且只與 Python 3.6 相容。如果你正在使用其它版本的 Python,就無法使用 Auto-Keras 程式包。
你可以通過以下命令檢視自己的 Python 版本:
$ python --version
當你已經準備好 Python 3.6 時,可以通過下面的「pip」命令安裝 Auto-keras:
$ pip install tensorflow # or tensorflow-gpu $ pip install keras $ pip install autokeras
如果你在安裝或使用 Auto-Keras 的過程中遇到了任何問題,可以將問題提交到其官方 Github 問題頁面,Auto-Keras 的作者可能會為你提供幫助。
用 Auto-Keras 實現訓練指令碼
我們用 Auto-Keras 實現訓練指令碼。開啟「train_auto_keras.py」檔案並嵌入以下程式碼:
# import the necessary packages from sklearn.metrics import classification_report from keras.datasets import cifar10 import autokeras as ak import os def main():# initialize the output directoryOUTPUT_PATH = "output"
首先,請引入第 2-5 行的專案所必需的程式包:
-
如前所述,我們將使用 scikit-learn 的「classification_report」來計算需要儲存到輸出檔案中的統計資訊。
-
我們將使用 CIFAR-10 資料集,然後輕鬆地將其整合到「keras.datasets」中。
-
接著,我們將引入最重要的「autokeras」包,將其簡寫為「ak」。
-
我們還需要引入「os」模組,因為在構建輸出檔案路徑時,我們將在各種作業系統上適配路徑分隔符。
在第 7 行,我們定義指令碼的「main」函式。由於 Auto-Keras 和TensorFlow處理執行緒的方式,我們需要將程式碼封裝在一個「main」函式中。更多詳細資訊,請參見 GitHub 問題表單:https://github.com/jhfjhfj1/autokeras/issues/311
在第 9 行,我們定義輸出路徑「OUTPUT_PATH」。
接下來,我們將為 Auto-Keras 初始化一個訓練時間列表:
# initialize the list of training times that we'll allow # Auto-Keras to train for TRAINING_TIMES = [ 60 * 60,# 1 hour 60 * 60 * 2,# 2 hours 60 * 60 * 4,# 4 hours 60 * 60 * 8,# 8 hours 60 * 60 * 12,# 12 hours 60 * 60 * 24,# 24 hours ]
第 13-20 行定義了一組訓練時間「TRAINING_TIMES」,包括「1, 2, 4, 8, 12, 24」小時。我們將使用 Auto-Keras 探究更長的訓練時長對準確率的影響。
接下來,我們將載入 CIFAR-10 資料集,並初始化各個圖片的類別名:
# load the training and testing data, then scale it into the # range [0, 1] print("[INFO] loading CIFAR-10 data...") ((trainX, trainY), (testX, testY)) = cifar10.load_data() trainX = trainX.astype("float") / 255.0 testX = testX.astype("float") / 255.0 # initialize the label names for the CIFAR-10 dataset labelNames = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]
本文所使用的 CIFAR-10 資料將被載入、儲存到第 25 行所示的訓練/測試切片片段中。隨後我們會將這些資料進行標準化處理,對映到 [0,1] 的區間上(如第 26、27 行程式碼所示)。我們在第 30、31 行中初始化類名(labelNames)。CIFAR-10 資料集中包含了這 10 類圖片。請注意,這裡類名的順序是十分重要的。
接下來,我們將開始根據「TRAINING_TIMES」進行迴圈工作,每次都會使用到 Auto-Keras:
# loop over the number of seconds to allow the current Auto-Keras # model to train for for seconds in TRAINING_TIMES: # train our Auto-Keras model print("[INFO] training model for {} seconds max...".format( seconds)) model = ak.ImageClassifier(verbose=True) model.fit(trainX, trainY, time_limit=seconds) model.final_fit(trainX, trainY, testX, testY, retrain=True) # evaluate the Auto-Keras model score = model.evaluate(testX, testY) predictions = model.predict(testX) report = classification_report(testY, predictions, target_names=labelNames) # write the report to disk p = os.path.sep.join(OUTPUT_PATH, "{}.txt".format(seconds)) f = open(p, "w") f.write(report) f.write("\nscore: {}".format(score)) f.close()
上面的程式碼塊是本文專案指令碼的核心部分。在第 35 行,我們對每一個「TRAINING_TIMES」定義了一個迴圈的工作流,我們將在每一輪工作流中:
-
初始化我們的模型(ak.ImageClassifier),並且啟動訓練(第 39、40 行)。請注意,我們並不會為一類特定的卷積神經網路例項化一個物件,也不需要跟往常一樣對 超引數 進行調優。Auto-Keras 會幫我們處理所有這些工作,並且生成其發現結果的報告。
-
一旦達到了時間限制,工作流將利用 Auto-Keras 尋找到的最佳模型和引數再次訓練模型(第 41 行)。
-
對模型進行評價並構建分類報告(第 44-47 行)。
-
將分類報告和準確率得分一同寫入磁碟,從而使我們能夠評價更長訓練時間的效果(第 50-54 行)。
我們將根據「TRAINING_TIMES」中的各個訓練時間重複執行這個過程。
最終,我們將檢查程式碼並啟動程式執行的主(main)執行緒:
# if this is the main thread of execution then start the process (our # code must be wrapped like this to avoid threading issues with # <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark>) if __name__ == "__main__": main()
在這裡,我們需要進行檢查,確保這是程式執行的主執行緒,然後編寫主函式。
僅僅使用這 60 行程式碼,我們就使用 CIFAR-10 資料集完成了 Auto-Keras 的樣例指令碼編寫工作。但我們的工作還沒有結束...
利用 Auto-Keras 訓練一個神經網路
接下來,我們將使用 Auto-Keras 訓練我們自己的神經網路。
請一定要使用本教程「Downloads」章節提到的方法下載專案所需的原始碼。
接著,請開啟一個終端,將工作路徑導航至你下載原始碼的地方,並執行下面的命令:
$ python train_auto_keras.py [INFO] training model for <mark data-type="institutions" data-id="e6402476-9c73-4340-b0c8-2b470157ce64">360</mark>0 seconds max... Preprocessing the images. Preprocessing finished. Initializing search. Initialization finished. +----------------------------------------------+ |Training model 0| +----------------------------------------------+ Using <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark> backend. No loss decrease after 5 epochs. Saving model. +--------------------------------------------------------------------------+ |Model ID|Loss|Metric Value| +--------------------------------------------------------------------------+ |0|4.816269397735596|0.5852| +--------------------------------------------------------------------------+ +----------------------------------------------+ |Training model 1| +----------------------------------------------+ Using <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark> backend. Epoch-14, Current Metric - 0.83:28%|██████▊| 110/387 [01:02<02:46,1.67 batch/s]Time is out. [INFO] training model for 86400 seconds max... Preprocessing the images. Preprocessing finished. Initializing search. Initialization finished. +----------------------------------------------+ |Training model 0| +----------------------------------------------+ Using <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark> backend. No loss decrease after 5 epochs. ... +----------------------------------------------+ |Training model 21| +----------------------------------------------+ Using <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark> backend. No loss decrease after 5 epochs. +--------------------------------------------------------------------------+ |Father Model ID|Added Operation| +--------------------------------------------------------------------------+ ||to_deeper_model 16 ReLU| |16|to_wider_model 16 64| +--------------------------------------------------------------------------+ Saving model. +--------------------------------------------------------------------------+ |Model ID|Loss|Metric Value| +--------------------------------------------------------------------------+ |21|0.8843476831912994|0.9316000000000001| +--------------------------------------------------------------------------+ +----------------------------------------------+ |Training model 22| +----------------------------------------------+ Using <mark data-type="technologies" data-id="58170354-4618-4a25-a2fe-c4ed169f2177">TensorFlow</mark> backend. Epoch-3, Current Metric - 0.9:80%|████████████████████▊| 310/387 [03:50<00:58,1.31 batch/s]Time is out. No loss decrease after 30 epochs.
如上圖所示,我們的指令碼指導 Auto-Keras 執行了 6 組實驗。
在英偉達的 K80 GPU 上,總的訓練時間(包括時間限制和模型重新擬合所需的時間)約為 3 天多一點。
Auto-Keras 的執行結果
圖 5:使用 Auto-Keras 通常是一個非常耗時的過程。用 Auto-Keras 訓練 8-12 個小時將得到適用於 CIFAR-10 的最佳網路模型。在此之後,Auto-Keras 無法進一步進行優化。
在上面的圖 5 中,你可以看到在使用 Auto-Keras 時訓練時長(x 軸所示)對於模型整體準確率(y 軸所示)的影響。
當訓練時間較短時(1-2 小時),模型的準確率約為 73%。訓練 4 個小時,模型就能達到 93% 的準確率。
在 8-12 小時訓練時間範圍內獲得的準確率最高,達到了 95%。
超過 8-1 2 小時的訓練並不能進一步提高模型的準確率,這意味著我們已經達到了效能的飽和點,Auto-Keras 無法進一步進行優化。
Auto-Keras 和 AutoML 有意義嗎?
圖 6:Auto-Keras(或 AutoML)有意義嗎?這無疑是業界向前邁出的一大步,尤其是可以幫助那些不具備深度學習領域知識的人。而且,經驗豐富的深度學習專家可以在更短的時間內建立網路架構、對其進行訓練,並且達到與手動構造網路相當的、甚至更好的模型準確率。
對於非專家的從業者來說,除了無監督學習(從無標籤的資料中自動學習模式)之外,自動機器學習被認為是機器學習的「聖盃」。
谷歌的 AutoML 和開源的 Auto-Keras 程式包都試圖為大眾提供機器學習解決方案,即使使用者不具備重要的技術經驗。
Auto-Keras 在 CIFAR-10 上的效果還不錯,筆者根據之前撰寫的關於深度學習、醫學影象和瘧疾檢測的文章進行了第二組實驗。
在那篇文章中,筆者使用一個簡化的 ResNet 架構,模型在經過了 1 個小時的訓練後獲得了 97.1% 的準確率。
然後,筆者讓 Auto-Keras 在相同的資料集上運行了 24 小時,結果只獲得了 96% 的準確率(低於手工定義的架構)。
谷歌的 AutoML 和 Auto-Keras 都是巨大的技術進步;然而,自動化機器學習的問題還遠遠沒有得到解決。
目前,相對於自動化機器學習技術,更加重要的還是掌握深度學習專業知識。這些領域的專業知識(特別是關於所使用的資料的知識),對於提高模型準確率非常關鍵。
筆者的建議是:仍然要豐富自己的專業知識,不要依賴自動機器學習演算法。
要成為一個成功的深度學習從業者和工程師,你需要在工作中使用恰當的工具。使用 AutoML 和 Auto-Keras 作為工具,然後繼續用其它知識充盈你自己的工具箱。
總結
本文討論了 Auto-Keras 和 AutoML,這是一組進行自動化的機器學習和深度學習的工具和程式庫。
Auto-Keras 和 AutoML 的最終目標都是通過使用神經網路架構搜尋(NAS)演算法,減少人們開始進行機器學習和深度學習任務的障礙。
NAS 演算法是 Auto-Keras 和 AutoML 的基石,它將自動地:
-
定義並優化一個神經網路架構
-
對模型的 超引數 進行調優
使用該框架的主要的好處有:
-
可以在具備非常有限的專業知識的情況下,執行機器學習和深度學習任務
-
獲得高模型準確率,並且具備泛化到訓練集和測試集以外的資料上的能力
-
使用圖形化互動介面或一個簡單的應用程式介面快速啟動、執行專案
-
在不費太大力氣的情況下,可能達到目前最好的模型效果
當然,這是要付費的,事實上費用來自於兩部分。
首先,谷歌的 AutoML 很貴,大約需要每小時 20 美元。為了節省資金,你可以使用 Auto-Keras,它是谷歌 AutoML 的開源替代方案,但是你仍然需要為 GPU 計算時間付費。用 NAS 演算法代替真實的深度學習專家將需要數小時的計算來搜尋最優引數。
雖然我們在 CIFAR-10 資料集上尋找到了具備高準確率的模型(~96% 的準確率),但是當筆者將 Auto-Keras 應用到之前關於醫學深度學習和瘧疾預測的文章上時,Auto-Keras 的準確率僅為 96.1%,比筆者 97% 的準確率低了整整一個百分點(而且 Auto-Keras 需要多用 2300% 的計算時間!
儘管 Auto-Keras 和 AutoML 可能是人們在自動機器學習和深度學習方面朝著正確方向進行的一步探索,但這一領域仍有大量的工作有待完成。
並沒有什麼用現有的演算法解決機器學習、深度學習問題的靈丹妙藥。相反,筆者建議深度學習從業者和工程師們不斷豐富自己的知識儲備。
原文連結:https://www.pyimagesearch.com/2019/01/07/auto-keras-and-automl-a-getting-started-guide/