search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

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

Nuts-ml 是一個新的 Python 數據預處理庫,專門針對視覺領域的 GPU 深度學習應用。 它以獨立、可復用的單元模塊的形式,提供主流數據預處理函數。前者便是「nuts-ml」 里的 「nuts」,開發者可自由將其排列組合,創建高效、可讀性強、方便修改的數據流。

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

Reader 讀取文本文件、 Excel 或 Pandas 表格中的樣本數據。接下來 Splitter 把數據分割為訓練、驗證和測試集,如需要再進行分層。一般情況下,並不是所有圖像數據都能載入內存,於是,我們需要 Loader 按需導入。這些圖像一般由 Transformer 進行處理,以修改尺寸、截圖或做其它調整。另外,為增加訓練集, Augmenter 會隨機選取圖像進行擴充(比如翻轉),以合成額外圖像。基於 GPU 的高效率的機器學習,需要用 Batcher 把圖像和標籤數據編成 mini-batch。隨後導入 Network 進行訓練或者推理。最後,為追蹤訓練過程,一般我們會用 Logger 來把訓練損失或精度記錄到 log 文件。

有些機器學習框架,比如 Keras,就在 API 中提供了這些預處理模塊。若與任務的匹配程度高,這就能大幅簡化神經網路的訓練。請見下面的用 keras 訓練採用了數據擴充(augmentation)的模型。

datagen = ImageDataGenerator( # augment images

width_shift_range=0.1,

height_shift_range=0.1,

horizontal_flip=True)

datagen.fit(x_train)

model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),

steps_per_epoch=x_train.shape[0]

epochs=epochs,

validation_data=(x_test, y_test))

但如果,深度學習框架的 API 沒有提供圖像格式、數據擴充等預處理功能呢?

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

這便要 nuts-ml 上場了。

如開頭介紹的,nuts-ml 是一個 Python 庫,它提供了常見的預處理函數,即所謂的 「nuts」,能自由排列並且輕鬆擴展,以創建高效的數據預處理流水線。下面是節選的一段 nuts-ml 示例代碼,展示了訓練神經網路的流水線,>> 指示操作流。

t_loss = (train_samples >> augment >> rerange >> Shuffle(100) >>

build_batch >> network.train >> Mean)

print "training loss :", t_loss

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

rerange = TransformImage(0).by('rerange', 0, 255, 0, 1, 'float32')

augment = (AugmentImage(0)

.by('identical', 1.0)

.by('brightness', 0.1, [0.7, 1.3])

.by('fliplr', 0.1)))

build_batch = (BuildBatch(BATCH_SIZE)

.by(0, 'image', 'float32')

.by(1, 'one_hot', 'uint8', NUM_CLASSES))

network = KerasNetwork(model)

重分配(rerange)是一個把 [0, 255] 區間的像素值轉化為 [0, 1] 區間的圖像轉換過程。數據擴充生成用於訓練的額外圖像。build_batch 創建由圖像和 one-hot 編碼的類標籤組成的 batch。神經網路把現有 Keras 模型封裝為一個 nut,後者能插入進流水線。該示例的完整代碼在這裡。

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

@nut_function

def AdjustBrightness(image, c):

return image * c

... images >> AdjustBrightness(1.1) >> ...

Nuts-ml 本身並不能進行神經網路的訓練,而是藉助於 Keras、Theano 等已有的庫來實現。任何能接受 Numpy 陣列的 mini-batch 用來訓練、推理的機器學習庫,都與它兼容。

關注 AI 研習社后,回復【1】獲取

想要挑戰AlphaGo卻不懂深度學習?

AI慕課學院專門打造了《12小時零基礎入門深度學習》,來自fastai中文社區最活躍的四位貢獻者為你打開深度學習入門的那扇門。

採用活力十足的矽谷模式,帶你實操9個深度學習項目。

即使零編程基礎,也能在這裡找到適合你的學習路徑。

僅限50名!掃碼了解詳情!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦