1. 程式人生 > >【火爐煉AI】深度學習008-Keras解決多分類問題

【火爐煉AI】深度學習008-Keras解決多分類問題

【火爐煉AI】深度學習008-Keras解決多分類問題

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0)

在我前面的文章【火爐煉AI】深度學習005-簡單幾行Keras程式碼解決二分類問題中,介紹了用Keras解決二分類問題。那麼多分類問題該怎麼解決?有哪些不同?


1. 準備資料集

為了演示,本次選用了博文keras系列︱影象多分類訓練與利用bottleneck features進行微調(三)中提到的資料集,原始的資料集將所有類別的train照片放到train資料夾中,所有的test照片放在test資料夾中,而用不同數字開頭來表示不同類別,比如以3開頭的照片就是bus類等。首先將這些不同類別的照片放在不同的資料夾中,最終的train資料夾有5個子資料夾,每個子資料夾中有80張圖片,最終的test資料夾中有5個子資料夾,每個子資料夾中有20張圖片。總共只有500張圖片。

在程式碼上,需要用ImageDataGenerator來做資料增強,並且用flow_from_directory來從資料夾中產生資料流。

程式碼和二分類的文章基本相同,此處就不貼出來了,可以去我的github直接看全部的程式碼。

唯一的不同之處是要設定class_mode='categorical',而不是原來二分類問題的class_mode='binary'


2. 模型的構建和訓練

基本和二分類一樣,如下為模型的構建部分:

# 4,建立Keras模型:模型的建立主要包括模型的搭建,模型的配置
from keras.models import Sequential
from keras.layers import
Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import optimizers def build_model(input_shape): # 模型的搭建:此處構建三個CNN層+2個全連線層的結構 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=input_shape)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2
, 2))) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) # Dropout防止過擬合 model.add(Dense(class_num)) # 此處多分類問題,用Dense(class_num) model.add(Activation('softmax')) #多分類問題用softmax作為activation function # 模型的配置 model.compile(loss='categorical_crossentropy', # 定義模型的loss func,optimizer, optimizer=optimizers.RMSprop(), # 使用預設的lr=0.001 metrics=['accuracy'])# 主要優化accuracy return model # 返回構建好的模型 複製程式碼

改變之處是:最後的Dense層需要用Dense(class_num)來代替Dense(1),然後用多分類的標配activation function: softmax。在模型的配置方面,也需要將loss function改為'categorical_crossentropy'。

通過模型的訓練後,最終結果如下所示:

從結果上看:沒有出現過擬合現象,但是test acc不太穩定,變化比較大。在平臺期後的test acc約為0.85.

########################小**********結###############################

1,多分類問題和二分類問題基本相同,不同之處在於:1,設定flow_flow_directory時要用設定class_mode='categorical'。2,模型的最後一層要用Dense(class_num)和softmax這個多分類專用啟用函式。3,模型的loss function要使用categorical_crossentropy。

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。