徐海蛟教學
在深度學習中,當數據量不夠大時候,常常採用下面4中方法:
1. 人工增加訓練集的大小. 通過平移, 翻轉, 加噪聲等方法從已有數據中創造出一批"新"的數據.也就是Data Augmentation
2. Regularization. 數據量比較小會導致模型過擬合, 使得訓練誤差很小而測試誤差特別大. 通過在Loss Function 後面加上正則項可以抑制過擬合的產生. 缺點是引入了一個需要手動調整的hyper-parameter. 詳見https://www.wikiwand.com/en/Regularization_(mathematics)
3. Dropout. 這也是一種正則化手段. 不過跟以上不同的是它通過隨機將部分神經元的輸出置零來實現. 詳見http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf
4. Unsupervised Pre-training. 用Auto-Encoder或者RBM的卷積形式一層一層地做無監督預訓練, 最後加上分類層做有監督的Fine-Tuning. 參考 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.207.1102&rep=rep1&type=pdf
下面我們來討論Data Augmentation:
不同的任務背景下, 我們可以通過圖像的幾何變換, 使用以下一種或多種組合數據增強變換來增加輸入數據的量. 這裏具體的方法都來自數字圖像處理的內容, 相關的知識點介紹, 網上都有, 就不一一介紹了.
旋轉 | 反射變換(Rotation/reflection): 隨機旋轉圖像一定角度; 改變圖像內容的朝向;
翻轉變換(flip): 沿着水平或者垂直方向翻轉圖像;
縮放變換(zoom): 按照一定的比例放大或者縮小圖像;
平移變換(shift): 在圖像平面上對圖像以一定方式進行平移;
可以採用隨機或人爲定義的方式指定平移範圍和平移步長, 沿水平或豎直方向進行平移. 改變圖像內容的位置;尺度變換(scale): 對圖像按照指定的尺度因子, 進行放大或縮小; 或者參照SIFT特徵提取思想, 利用指定的尺度因子對圖像濾波構造尺度空間. 改變圖像內容的大小或模糊程度;
對比度變換(contrast): 在圖像的HSV顏色空間,改變飽和度S和V亮度分量,保持色調H不變. 對每個像素的S和V分量進行指數運算(指數因子在0.25到4之間), 增加光照變化;
噪聲擾動(noise): 對圖像的每個像素RGB進行隨機擾動, 常用的噪聲模式是椒鹽噪聲和高斯噪聲;
顏色變換(color): 在訓練集像素值的RGB顏色空間進行PCA, 得到RGB空間的3個主方向向量,3個特徵值, p1, p2, p3, λ1, λ2, λ3. 對每幅圖像的每個像素Ixy=[IRxy,IGxy,IBxy]T進行加上如下的變化:
[p1,p2,p3][α1λ1,α2λ2,α3λ3]T
其中:αi是滿足均值爲0,方差爲0.1的隨機變量.
代碼實現
作爲實現部分, 這裏介紹一下在python 環境下, 利用已有的開源代碼庫Keras作爲實踐:
1 # -*- coding: utf-8 -*- 2 __author__ = 'Administrator' 3 4 # import packages 5 from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img 6 7 datagen = ImageDataGenerator( 8 rotation_range=0.2, 9 width_shift_range=0.2,10 height_shift_range=0.2,11 shear_range=0.2,12 zoom_range=0.2,13 horizontal_flip=True,14 fill_mode='nearest')15 16 img = load_img('C:\Users\Administrator\Desktop\dataA\lena.jpg') # this is a PIL image, please replace to your own file path17 x = img_to_array(img) # this is a Numpy array with shape (3, 150, 150)18 x = x.reshape((1,) + x.shape) # this is a Numpy array with shape (1, 3, 150, 150)19 20 # the .flow() command below generates batches of randomly transformed images21 # and saves the results to the `preview/` directory22 23 i = 024 for batch in datagen.flow(x,25 batch_size=1,26 save_to_dir='C:\Users\Administrator\Desktop\dataA\pre',#生成後的圖像保存路徑27 save_prefix='lena',28 save_format='jpg'):29 i += 130 if i > 20:31 break # otherwise the generator would loop indefinitely
主要函數:ImageDataGenerator
實現了大多數上文中提到的圖像幾何變換方法.
rotation_range: 旋轉範圍, 隨機旋轉(0-180)度;
width_shift and height_shift: 隨機沿着水平或者垂直方向,以圖像的長寬小部分百分比爲變化範圍進行平移;
rescale: 對圖像按照指定的尺度因子, 進行放大或縮小, 設置值在0 - 1之間,通常爲1 / 255;
shear_range: 水平或垂直投影變換, 參考這裏 https://keras.io/preprocessing/image/
zoom_range: 按比例隨機縮放圖像尺寸;
horizontal_flip: 水平翻轉圖像;
fill_mode: 填充像素, 出現在旋轉或平移之後.
效果如下圖所示: