(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0)git
在我前面的文章【火爐煉AI】深度學習005-簡單幾行Keras代碼解決二分類問題中,介紹了用Keras解決二分類問題。那麼多分類問題該怎麼解決?有哪些不一樣?github
爲了演示,本次選用了博文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'ui
基本和二分類同樣,以下爲模型的構建部分:spa
# 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'。.net
經過模型的訓練後,最終結果以下所示:code
從結果上看:沒有出現過擬合現象,可是test acc不太穩定,變化比較大。在平臺期後的test acc約爲0.85.cdn
########################小**********結###############################
1,多分類問題和二分類問題基本相同,不一樣之處在於:1,設置flow_flow_directory時要用設置class_mode='categorical'。2,模型的最後一層要用Dense(class_num)和softmax這個多分類專用激活函數。3,模型的loss function要使用categorical_crossentropy。
#################################################################
注:本部分代碼已經所有上傳到(個人github)上,歡迎下載。