cifar_10_title.png

  真實世界的圖片大部分是彩色影像。相對於灰階的黑白影像,彩色影像只有在色彩上比灰階多了紅綠藍三原色的顏色。也因此,在辨識精確度上就有很高的不確定性。本文紀錄 Google 資料集裡的彩色影像 Cifar-10的識別紀錄。
 

1. 資料讀取

  在 Google 資料集裡面,只要一行指令就可以讀取 Cifar-10 資料  

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

  如果以前都沒抓取過 Cifar-10 資料,第一次讀取會從國外網站抓取。大約花費 10 幾分鐘的時間。
1_0_getdata.png

  接下來我們可以看一下資料的分佈形狀
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

1_1_0_shape.png

  Python 裡面資料型態是 筆數,寬度,長度,位元數目。圖片是彩色資料,因此在最後一筆的 位元數目 有 3 個數字,分別代表 R(紅色) G(綠色) 和 B(藍色)。

  如果還不清楚,利用 debugger 來看資料內部就更清楚了:
1_3_1pixel_3values.png

  縱軸是某一個圖素(pixel),而橫軸則代表那個圖素(pixel)的R(紅色) G(綠色) 和 B(藍色)數值。

  這和我們以前看到純黑白的影像不大一樣:以前是一個圖素(pixel)只有一個灰階的數值
1_2_gray_pixel_1value.png

2.資料顯示

  由於資料量 50000 過大,不可能顯示出每一筆資料。這裡就簡單顯示 訓練資料的前9筆資料。

import matplotlib.pyplot as plt
num=0
for num in range(0,9):
   plt.subplot(3,3,num+1)
   plt.title('[%d]->%d'% (num, y_train[num]))
   plt.imshow(x_train[num])
plt.show()

2_1_3_3_subplots.png

  看過這些資料,我會有以下的感想:
1. 顏色分佈不一致,而且差異性很高。這些都會提高以後訓練的困難度。而驗證時精確度也會降低。

2. 物體在圖中的位置和大小都不一致,這也會造成驗證精確度的下降。

3. 圖片資料轉換成訓練資料
 x_train = (50000, 32, 32, 3)
 對於圖形資料,這樣的資料放置很正常。但對於未來的 深度學習的訓練資料,就需要做一些修改。訓練資料中資料的型態是(筆數,特徵)。因此我們需要將 32*32 的二維圖片資料轉換為一整筆一維的特徵資料。二維轉換為一維的資料,那就成為 32*32 = 1024。再加上 RGB 三種原色的資料,最後大小是:1024*3=3072。程式可以這樣寫:

eachsize=32*32*3
X_train=x_train.reshape(x_train.shape[0],eachsize)

再來看轉換後的結果:
print('x_train after reshape:', x_train.shape)

x_train after reshape: (50000, 3072)

已經從原本的 (50000, 32, 32, 3) 轉成(50000, 3072) 了!

資料展開內容:

2_1_reshape_xtrain.png

4.資料正規化/特徵縮放(feature scaling)

  當資料間數值差異過大時,可以用正規化/特徵縮放(feature scaling) 技巧將差異降低。
  這裡我還是沿用以前的方式,sklearn.preprocessing 裡面的 MinMaxScaler

  但是在處理之前,還需要先做一個工作:將資料格式轉換成浮點數(floating point number)。如果沒有做,任何整數除以 255 之後都會成為 0,那就無法保存正規化後的資料了!

  在 numpy 資料格式裡面,轉換資料的格式可用下面的程式:
X_train_float=x_train.astype(np.float32)

3_1_x_all_float.png

可以看到資料內容已經轉換成浮點數

  再使用 MinMaxScaler 來轉換
from sklearn.preprocessing import MinMaxScaler
sc=MinMaxScaler()
X_all_float=sc.fit_transform(X_all_float)

  這裡可以看到內容已經改成正規化後的浮點數了!

3_3_x_all_float_scaled.png

5. 深度學習訓練及驗證

  以前在灰階影像辨識,資料量比較低。
  現在是彩色影像,資料量是以前的三倍!
訓練時間也比灰階影像更多!

  以前在訓練過程中,我們會在訓練過程結束後將訓練後的模型權重(model weights)儲存下來。

而現在整筆訓練資料訓練時間會增加,那就表示模型權重(model weights)儲存的時間也會拖得更久。

因此,對於這種長時間的訓練工作,訓練的函式也需要改變。

  以前用的是 model.fit(x_train, y_train)
  現在用的是 model.train_on_batch(x_train, y_train)

 train_on_batch 可以設定在執行多少次後,就將已經訓練好的模型權重(model weights)儲存。

  訓練資料集有 50000 筆資料;訓練次數(epochs)設到 3560 次。

  在訓練資料集,分類精確度可到 97.96%
但在測試資料集,分類精確度只能到 74.58%
可見對於彩色影像分類,精確度仍沒有太好。

5_acc_comp.png

 


 

arrow
arrow
    文章標籤
    Python Cifar-10 RGB
    全站熱搜
    創作者介紹
    創作者 小木屋 的頭像
    小木屋

    小木屋

    小木屋 發表在 痞客邦 留言(0) 人氣()