Here is how to use Keras to train an image classification model.使用keras訓練圖像分類

Source: Deep Learning on Medium

第三步驟:

#線性堆疊模型,將之後神經網路層加入
model = Sequential()

#construck CNN Model
model.add(Conv2D(filter=32, (3, 3), input_shape=input_shape))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(filter=32, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(filter=64, (6, 6)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(18)) #打上自己資料夾中有幾個分類
model.add(Activation('softmax')) #多個的話一定要用Softmaxmodel.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=['sparse'])

model.add(Conv2D(filter=代表這一層有幾個kernal, kernal size=(3, 3), input_shape=維度))。所以上面程式碼代表著我們會輸出32個224*224的RGB影像。

model.add(Activation(‘relu’)),Activation激勵函數的選擇,激勵函數是用來解決非線性線性方程,因為通常cnn運算是以線性組合運算,通常Hidden layerinput layer都存在著非線性的問題若沒有使用非線性之激勵函數,則cnn訓練出來的模型便失去意義。那麼我們在選擇激勵函數有五種分別是Sigmoid、Tanh、ReLU、Leaky ReLU、SoftMax和ELU。relu的分段線性能有效的克服梯度消失的問題。當然還是依照你是訓練怎麼樣的模型來決定這個參數的變化。

model.add(MaxPooling2D(pool_size=(2, 2))),pool_size池化層(2,2)這是代表我們將剛剛那一層的輸出後的影像再以32個112*112的方式輸出。

model.add(Dropout(0.5)),訓練過程中隨機地忽略一些神經元,這可以使得我們accuracy的數值上升。

model.add(Flatten())為flatten layer,經過flatten layer計算後會轉為一維802816。

model.compile(loss=’選擇損失函數’,optimizer=’優化方法’,metrics=[‘成效衡量方式’])。

loss 為損失函數,損失函數當中我們有兩個較常用(其他的官網有介紹)參數可以選擇categorical cross entropybinary cross entropy,categorical cross entropy適用於多分類時所用,binary cross entropy是二分類所用,我們目前要訓練的資料夾當中有18個項目當然選擇要為CE。

optimizer優化器為什麼我們的optimizer要使用rmsprop,這一部份是可以解決我們模型出來後會有overfitting的現象造成模型發散。

metrics只有metrics是複數形式。因為一個模型只能指明一个optimizer和loss,卻可以使用多個metrics,那為什麼這裡我們用到 ’sparse’原因很簡單因為我們loss function是多個類型所以要選擇sparse。如果是二分類的話則使用‘accuracy’。