2018年1月29日 星期一

Keras: CNN辨識Cifar-10

CIRAF-10資料集是一組影像辨識的資料集,共有十種分類(包含有鳥、貓、汽車、卡車等等圖片,因圖片是彩色,雜訊多(有時連人都難以辨認),所以辨識難度比之前的MNIST高得多。我們接下來就以CNN(Convolution neural network)建立模型,進行CIRAF-10資料庫的辨識。
CNN一般來說比先前的基礎ANN多元感知器能達到更高的準確率,利用卷積層及池化層能提取圖片的特徵,增加辨識的能力,CNN的基礎理論從這裡可以看到不錯的介紹,所以就不囉嗦,直接來看看Keras程式吧。
先import需要的資料庫及CIRAF-10資料集,因Keras已內建,可以直接使用cifra10.load_data()的指令讀取:

另外開一個dictionary(label_dictionary)儲存每一個label數字代表的類別(共十種)。

看一下download的內容:

可以知道有訓練圖形(image)資料50000筆,驗證(Test)資料則有10000筆,每一筆資料為32x32的矩陣,最後一個維度是RGB三原色三個數字,代表圖素的顏色。標籤(label)的資料則有一個數字表示圖片的類別。

我們可以看一筆資料中的一個畫素:
(159, 102, 101)各代表RGB三原色的數字大小,可進一步看圖片:
是一台紅色車子,預期標籤應該是1(注意程式中已利用dictionary轉換標籤了)。

接下來進行數據的預處理,同樣包含了設定類型(float32)並標準化以提升準確率,可以看一下第一筆資料的第一個圖素,確定有沒有錯誤:

另外有一點要注意的是,跟ANN有差異的地方在於資料轉換,MNIST原本資料是(60000, 28, 28),ANN轉換成一維的784個數字(看這邊),而CNN必須保持圖片二維的特性,之後才可以利用卷積層及池化層提取圖片的特徵。

標籤方面也是必需轉換成one hot encoding的型態(也一樣可以參考前篇):

接下來就是模型的設定了:

這邊不得不感恩Keras!讚嘆Keras!!!!把最困難的部分變得簡單極了,我相信只要這篇懂了,也知道CNN的原理,模型建立的程式根本是一塊小蛋糕了,除了每層的參數設定有點小變化,一點難度都沒有(不過程式跑得比較久就是)。

總結一下整個程式如下:

同樣地以圖表看看最後結果:

可以清楚看到大量使用Dropout(最後一次參數為0.5)確實可以降低overfitting的現象,train及validation的差異較小。

訓練完model之後,接著就是以Test的資料測試,同樣使用model.evaluate指令:
測試結果的loss為0.824而準確率(accuracy)約72.6%,相較於先前的MNIST資料集確實低很多,當然圖片為彩色且雜訊多應該是主要原因吧。

接下來就是進行預測囉,仍然利用model.predict_classes()的指令預測,
從結果看來前三筆預測結果分別是3,8,8,對照先前的dictionary分別為貓、船及船。同樣地直接看前三筆資料的圖檔會比較有真實感:

老實說,我還真不知道怎判斷第一筆資料是貓(cat)耶!

接下來仍然利用pandas的.crosstab指令產生confusion matrix(混淆矩陣),可以清楚哪些是正確預測的部分(對角線),哪些是預測錯誤的部分了。例如這次來看看標籤是0但預測成5的有8筆資料。


同樣地先建立下列標籤與預測值對照的完整表格,先看前三筆資料,跟先前的一樣,所以應該錯誤機率不大:

接下來看看哪些是標籤為0(飛機)但卻是預測為5(狗)的資料:

接下來print出第1898筆資料看看:
ㄟ.......這哪像狗了啊?一看就是飛機啊,只能說人工智慧跟人類思考還是不一樣,對照第一筆資料人類大概很難看出是貓,或許未來機器人跟人類的智慧還是互補的吧!!??


參考資料
TensorFlow+Keras深度學習人工智慧實務應用


沒有留言:

張貼留言