1
本文作者: 三川 | 2017-05-31 19:05 |
雷鋒網(wǎng)按:本文作者 Stefan Maetschke 為 IBM 機器學(xué)習(xí)架構(gòu)模型專家,根據(jù)自身工作經(jīng)歷向大家推薦這款全新的數(shù)據(jù)預(yù)處理工具。雷鋒網(wǎng)編譯。
Nuts-ml 是一個新的 Python 數(shù)據(jù)預(yù)處理庫,專門針對視覺領(lǐng)域的 GPU 深度學(xué)習(xí)應(yīng)用。 它以獨立、可復(fù)用的單元模塊的形式,提供主流數(shù)據(jù)預(yù)處理函數(shù)。前者便是“nuts-ml” 里的 “nuts”,開發(fā)者可自由將其排列組合,創(chuàng)建高效、可讀性強、方便修改的數(shù)據(jù)流。
對于機器學(xué)習(xí)項目,數(shù)據(jù)預(yù)處理都是基礎(chǔ)。相比實際的機器學(xué)習(xí),開發(fā)者花在數(shù)據(jù)預(yù)處理上的時間往往還要更多。有的數(shù)據(jù)預(yù)處理任務(wù)只針對特定問題,但大多數(shù),比如把數(shù)據(jù)分割為訓(xùn)練和測試組、給樣本分層和創(chuàng)建 mini-batch 都是通用的。下面的 Canonical 流水線展示了深度學(xué)習(xí)視覺任務(wù)常見的處理步驟。
Reader 讀取文本文件、 Excel 或 Pandas 表格中的樣本數(shù)據(jù)。接下來 Splitter 把數(shù)據(jù)分割為訓(xùn)練、驗證和測試集,如需要再進行分層。一般情況下,并不是所有圖像數(shù)據(jù)都能載入內(nèi)存,于是,我們需要 Loader 按需導(dǎo)入。這些圖像一般由 Transformer 進行處理,以修改尺寸、截圖或做其它調(diào)整。另外,為增加訓(xùn)練集, Augmenter 會隨機選取圖像進行擴充(比如翻轉(zhuǎn)),以合成額外圖像。基于 GPU 的高效率的機器學(xué)習(xí),需要用 Batcher 把圖像和標簽數(shù)據(jù)編成 mini-batch。隨后導(dǎo)入 Network 進行訓(xùn)練或者推理。最后,為追蹤訓(xùn)練過程,一般我們會用 Logger 來把訓(xùn)練損失或精度記錄到 log 文件。
有些機器學(xué)習(xí)框架,比如 Keras,就在 API 中提供了這些預(yù)處理模塊。若與任務(wù)的匹配程度高,這就能大幅簡化神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。請見下面的用 keras 訓(xùn)練采用了數(shù)據(jù)擴充(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))
但如果,深度學(xué)習(xí)框架的 API 沒有提供圖像格式、數(shù)據(jù)擴充等預(yù)處理功能呢?
擴展 Keras 這樣的庫并不是一個輕松的活兒。常見的解決方案是簡單粗暴地(重新)實現(xiàn)所需功能。但實現(xiàn)一個強魯棒性的數(shù)據(jù)流水線,能按需加載、轉(zhuǎn)換、擴充、處理圖像仍然很具挑戰(zhàn)性,并且有很高時間成本。
這便要 nuts-ml 上場了。
如開頭介紹的,nuts-ml 是一個 Python 庫,它提供了常見的預(yù)處理函數(shù),即所謂的 “nuts”,能自由排列并且輕松擴展,以創(chuàng)建高效的數(shù)據(jù)預(yù)處理流水線。下面是節(jié)選的一段 nuts-ml 示例代碼,展示了訓(xùn)練神經(jīng)網(wǎng)絡(luò)的流水線,>> 指示操作流。
t_loss = (train_samples >> augment >> rerange >> Shuffle(100) >>
build_batch >> network.train() >> Mean())
print "training loss :", t_loss
上面的示例中,訓(xùn)練圖像被擴充,像素值被重新分配,樣本在創(chuàng)建訓(xùn)練網(wǎng)絡(luò)的 batch 之前被打亂順序。最后,batch 的平均訓(xùn)練損失被分批計算、打印出來。組成該數(shù)據(jù)流的 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] 區(qū)間的像素值轉(zhuǎn)化為 [0, 1] 區(qū)間的圖像轉(zhuǎn)換過程。數(shù)據(jù)擴充生成用于訓(xùn)練的額外圖像。build_batch 創(chuàng)建由圖像和 one-hot 編碼的類標簽組成的 batch。神經(jīng)網(wǎng)絡(luò)把現(xiàn)有 Keras 模型封裝為一個 nut,后者能插入進流水線。該示例的完整代碼在這里。
Nuts-ml 的作用,是幫助開發(fā)者在深度學(xué)習(xí)任務(wù)重更快地創(chuàng)建數(shù)據(jù)預(yù)處理流水線。產(chǎn)生的代碼根據(jù)可讀性,修改后還可試驗不同的預(yù)處理方案。針對特定任務(wù)的函數(shù)可方便地作為 nuts 實現(xiàn)并添加進數(shù)據(jù)流。下面就是一個調(diào)整圖像亮度的簡單 nut:
@nut_function
def AdjustBrightness(image, c):
return image * c
... images >> AdjustBrightness(1.1) >> ...
Nuts-ml 本身并不能進行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,而是借助于 Keras、Theano 等已有的庫來實現(xiàn)。任何能接受 Numpy 陣列的 mini-batch 用來訓(xùn)練、推理的機器學(xué)習(xí)庫,都與它兼容。
via kdnuggets,雷鋒網(wǎng)編譯
相關(guān)文章:
谷歌發(fā)布全新TensorFlow庫“tf.Transform” 簡化機器學(xué)習(xí)數(shù)據(jù)預(yù)處理過程
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。