【火爐煉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)上,歡迎下載。