影象資料不足時,你可以試試資料擴充
在 ofollow,noindex">EZDL到底怎樣,試試看… 中,我們談到百度的線上AI設計工具EasyDL不需要調整任何引數,對於使用者而言就是一個吃資料的黑盒子。也許系統會選擇最優的引數和演算法來訓練出一個好的模型,如果此時準確率仍然達不到我們的需求,我們是否就完全束手無策了呢?
也不完全是。我們知道, 豐富的高質量資料是訓練出好的機器學習模型的關鍵 。但是良好的資料不會從天上掉下來,靠人工收集資料是一個非常費時費力的工作,關鍵是,在特定的領域,有效的資料很難獲取,比如醫學影像資料。
這個時候, 採用一些程式手段擴充資料集就成為了解決資料缺乏的一種方法 ,它可以將訓練集的大小增加10倍或更多。更讓人鼓舞的是,這樣訓練出的模型通常會更加健壯,減少過擬合。
資料擴充(Data Augmentation)是指根據一些先驗知識,在保持特定資訊的前提下,對原始資料進行適當變換以達到擴充資料集的效果。這個其實很好理解,一張貓的圖片,對其進行旋轉、縮放等變換,我們人類還是能辨認出。具體到影象分類任務中,在保持影象類別不變的前提下,可以對訓練集中的每幅影象進行一下變換:
-
一定程度內的隨機旋轉、平移、縮放、裁剪、填充、左右翻轉等,這些變換對應著同一個目標在不同角度的觀察結果。
-
對影象中的畫素新增噪聲擾動,比如椒鹽噪聲、高斯白噪聲等。
-
顏色變換。
-
改變影象的亮度、清晰度、對比度、銳度等。
如果你對影象處理並不是那麼熟悉,不用慌張,對於萬能的python而言,只要有需求,總有人提供程式庫,github上就有一個imgaug的python庫,下面展示一些影象擴充的樣例:
通過資料擴充,我們可以將原來的資料集規模擴大64倍。
這個imgaug庫,功能相當強大,文件也還算比較全。如果你覺得引入第三方庫太麻煩,也可以考慮keras提供的資料擴充API。
keras影象擴充API
與Keras的其他部分一樣,影象增強API簡單而強大。
Keras提供了 ImageDataGenerator 類,提供如下功能:
-
樣本標準化
-
功能標準化
-
ZCA增白
-
隨機旋轉,移位,剪下和翻轉。
-
尺寸重組
-
將增強的影象儲存到磁碟。
以下程式碼建立 ImageDataGenerator
datagen = ImageDataGenerator()
API不是在記憶體中對整個影象資料集執行操作,而是訓練模型的迭代過程中實時建立增強的影象資料,這可以減少記憶體開銷,但會增加一些額外的訓練時間成本。
建立並配置 ImageDataGenerator 後,必須將其應用到資料集上,這將計算實際執行影象資料轉換所需的資訊,該操作通過呼叫資料生成器上的 fit()函式 並將其傳遞給訓練資料集來完成。
datagen.fit(train)
資料生成器本身實際上是一個迭代器,在請求時返回批量的影象樣本。我們可以通過呼叫 flow()函式 來配置批量大小並獲取批量影象。
X_batch, y_batch = datagen.flow(train, train, batch_size=32)
最後,我們可以使用資料生成器,必須呼叫fit_generator()函式並傳入資料生成器和每個輪次的樣本數以及要訓練的輪次總數,而不是在我們的模型上呼叫fit()函式。
fit_generator(datagen, samples_per_epoch=len(train), epochs=100)
更多關於keras影象擴充API的資訊,還請參考官方文件:https://keras.io/preprocessing/image/。
參考
-
百面機器學習 - 演算法工程師帶你去面試,諸葛越主編,人民郵電出版社
-
https://keras.io/preprocessing/image/
-
https://github.com/aleju/imgaug
-
https://machinelearningmastery.com/image-augmentation-deep-learning-keras/
往期回顧