天天看點

你在資料預處理上花費的時間,是否比機器學習還要多?

nuts-ml 是一個新的 python 資料預處理庫,專門針對視覺領域的 gpu 深度學習應用。 它以獨立、可複用的單元子產品的形式,提供主流資料預處理函數。前者便是“nuts-ml” 裡的 “nuts”,開發者可自由将其排列組合,建立高效、可讀性強、友善修改的資料流。

對于機器學習項目,資料預處理都是基礎。相比實際的機器學習,開發者花在資料預處理上的時間往往還要更多。有的資料預處理任務隻針對特定問題,但大多數,比如把資料分割為訓練和測試組、給樣本分層和建立 mini-batch 都是通用的。下面的 canonical 流水線展示了深度學習視覺任務常見的處理步驟。 

你在資料預處理上花費的時間,是否比機器學習還要多?

reader 讀取文本檔案、 excel 或 pandas 表格中的樣本資料。接下來 splitter 把資料分割為訓練、驗證和測試集,如需要再進行分層。一般情況下,并不是所有圖像資料都能載入記憶體,于是,我們需要 loader 按需導入。這些圖像一般由 transformer 進行處理,以修改尺寸、截圖或做其它調整。另外,為增加訓練集, augmenter 會随機選取圖像進行擴充(比如翻轉),以合成額外圖像。基于 gpu 的高效率的機器學習,需要用 batcher 把圖像和标簽資料編成 mini-batch。随後導入 network 進行訓練或者推理。最後,為追蹤訓練過程,一般我們會用 logger 來把訓練損失或精度記錄到 log 檔案。

但如果,深度學習架構的 api 沒有提供圖像格式、資料擴充等預處理功能呢?

擴充 keras 這樣的庫并不是一個輕松的活兒。常見的解決方案是簡單粗暴地(重新)實作所需功能。但實作一個強魯棒性的資料流水線,能按需加載、轉換、擴充、處理圖像仍然很具挑戰性,并且有很高時間成本。

這便要 nuts-ml 上場了。

上面的示例中,訓練圖像被擴充,像素值被重新配置設定,樣本在建立訓練網絡的 batch 之前被打亂順序。最後,batch 的平均訓練損失被分批計算、列印出來。組成該資料流的 nuts 可如下定義:

重配置設定(rerange)是一個把 [0, 255] 區間的像素值轉化為 [0, 1] 區間的圖像轉換過程。資料擴充生成用于訓練的額外圖像。build_batch 建立由圖像和 one-hot 編碼的類标簽組成的 batch。神經網絡把現有 keras 模型封裝為一個 nut,後者能插入進流水線。該示例的完整代碼在這裡。

nuts-ml 的作用,是幫助開發者在深度學習任務重更快地建立資料預處理流水線。産生的代碼根據可讀性,修改後還可試驗不同的預處理方案。針對特定任務的函數可友善地作為 nuts 實作并添加進資料流。下面就是一個調整圖像亮度的簡單 nut:

nuts-ml 本身并不能進行神經網絡的訓練,而是借助于 keras、theano 等已有的庫來實作。任何能接受 numpy 陣列的 mini-batch 用來訓練、推理的機器學習庫,都與它相容。

====================================分割線================================

本文作者:三川