你在数据预处理上花费的时间,是否比机器学习还要多?
你在數據預處理上花費的時間,是否比機器學習還要多?
| 本文作者:三川 | 2017-05-31 19:05 |
雷鋒網按:本文作者??Stefan Maetschke 為 IBM 機器學習架構模型專家,根據自身工作經歷向大家推薦這款全新的數據預處理工具。雷鋒網編譯。
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 用來訓練、推理的機器學習庫,都與它兼容。
總結
以上是生活随笔為你收集整理的你在数据预处理上花费的时间,是否比机器学习还要多?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凭借识别人的情绪,他们做到了2000多万
- 下一篇: AlphaGo之父哈萨比斯: 先解决智能