指南:使用Keras和TensorFlow探索數據增強

  • 2019 年 10 月 26 日
  • 筆記

數據擴充是一種用於通過使用裁剪、填充、翻轉等技術來增加數據量的策略。

數據擴充使模型對較小的變化更魯棒,因此可以防止模型過度擬合。將擴充後的數據存儲在記憶體中既不實際也不高效,這就是Keras的Image Data Generator類(也包含在TensorFlow的高級API:tensorflow.keras中)發揮作用的地方。

Image Data Generator生成具有實時數據增強功能的批量tensor 影像數據。最好的部分是什麼?只需一行程式碼!

生成器生成的輸出影像將具有與輸入影像相同的輸出維度。下面是一個輔助腳本,我們將使用它來可視化顯示使用Image Data Generator類可以實現的所有功能。

  from tensorflow.keras.preprocessing.image import ImageDataGenerator  from matplotlib.pyplot import imread, imshow, subplots, show      def plot(data_generator):      """      Plots 4 images generated by an object of the ImageDataGenerator class.      """      data_generator.fit(images)      image_iterator = data_generator.flow(images)        # Plot the images given by the iterator      fig, rows = subplots(nrows=1, ncols=4, figsize=(18,18))      for row in rows:          row.imshow(image_iterator.next()[0].astype('int'))          row.axis('off')      show()    image = imread("image.jpeg")    # Creating a dataset which contains just one image.  images = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))    imshow(images[0])  show()

1.Rotation

data_generator = ImageDataGenerator(rotation_range=90)  plot(data_generator)

通過指定rotation_range,生成的數據可以隨機旋轉一個角度,範圍為從+ rotation_range到-rotation_range(以度為單位)。

2.Width Shifting

data_generator = ImageDataGenerator(width_shift_range=0.3)  plot(data_generator)

width_shift_range是一個介於0.0到1.0之間的浮點數,它指定影像要向左或向右隨機移動的總寬度分數的上限。

3.Height Shifting

data_generator = ImageDataGenerator(height_shift_range=0.3)  plot(data_generator)

就像寬度移動一樣,只是影像是垂直移動而不是水平移動。

4.Brightness

data_generator = ImageDataGenerator(brightness_range=(0.1, 0.9))  plot(data_generator)

Brightness_range指定用於隨機選擇一個亮度偏移值的範圍。0.0的亮度對應的是絕對沒有亮度,而1.0對應的是最大亮度。

5.Shear Intensity

data_generator = ImageDataGenerator(shear_range=45.0)  plot(data_generator)

Shear Intensity使影像的形狀傾斜。這與旋轉不同,因為在Shear Intensity中,我們固定一根軸,將影像按照一定的角度進行拉伸,即Shear Intensity。這會在影像中產生某種「拉伸」,這在旋轉中是無法看到的。 shear_range以度為單位指定傾斜角度。

6.Zoom

data_generator = ImageDataGenerator(zoom_range=[0.5, 1.5])  plot(data_generator)

通過zoom_range參數獲得隨機縮放。小於1.0的變焦會放大影像,而大於1.0的變焦會縮小影像。

7.Channel Shift

data_generator = ImageDataGenerator(channel_shift_range=150.0)  plot(data_generator)

Channel Shift將通道值隨機移位一個隨機值,該值是從channel_shift_range指定的範圍中選擇的。

8.Horizontal Flip

data_generator = ImageDataGenerator(horizontal_flip=True)  plot(data_generator)

generator將生成影像,這些影像將水平翻轉。

9.Vertical Flip

data_generator = ImageDataGenerator(vertical_flip=True)  plot(data_generator)

除了水平翻轉外,我們還可以應用垂直翻轉。但是那些沒有任何價值的點呢?

我們有幾個選項,可以選擇如何填充這些區域。

1.Nearest

這是默認選項,其中選擇最接近的像素值並對所有空值重複該值。(例如,aaaaaaaa | abcd | dddddddd)

data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='nearest')  plot(data_generator)

2.Reflect

此模式會創建「反射」,並以與已知值相反的順序填充空值。(例如abcddcba | abcd | dcbaabcd)

data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='reflect')  plot(data_generator)

3.Wrap

除了反射效果,我們還可以通過將已知點的值複製到未知點中,從而保持順序不變來創建「Wrap」效果。(例如abcdabcd | abcd | abcdabcd)

data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='wrap')  plot(data_generator)

4.Constant

如果我們想用常數值填充輸入邊界之外的所有點,則此模式可以幫助我們準確地實現這一點。常量值由cval參數指定。

  data_generator = ImageDataGenerator(width_shift_range=0.3,                                      fill_mode='constant',                                      cval=190)  plot(data_generator)

此外,還有一些其他好處。一些示例例如數據歸零(featurewise_center,samplewise_center)和歸一化(featurewise_std_normalization,samplewise_std_normalization)。可以通過將其布爾值傳遞給Image Data Generator類來設置這些變數。我們還可以通過指定rescale參數來對值進行重新縮放,該參數將與所有值相乘。

另外,還有一個參數preprocessing_function,您可以使用該參數指定自己的自定義函數來執行影像處理。