2017-07-14 94 views
1

我正在訓練一個使用keras和tensorflow的圖像二進制分類(每個15k個樣本)的CNN。訓練損失增加,同時驗證準確性增加

這是我的模型:

#input layer : first conv layer 
model = Sequential() 
model.add(Conv2D(filters=32, 
       kernel_size=(5,5), 
       input_shape=(256,256,3), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.1)) 

# second conv layer 
model.add(Conv2D(filters=64, 
       kernel_size=(5,5), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.2)) 
# third layer 
model.add(Conv2D(filters=128, 
       kernel_size=(5,5), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.3)) 
# fourth layer : FC layer 
model.add(Flatten()) 
model.add(Dense(128,kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
# prediction layer 
model.add(Dense(2,activation='softmax',name='prediction',kernel_regularizer=regularizers.l2(0.0001))) 

我使用亞當(設置爲默認keras文檔中給出的值)爲優化器。 當我開始訓練模型時,它開始行爲怪異。

大紀元一百八十零分之十四 191s - 損失:0.7426 - ACC:0.7976 - val_loss:0.7306 - val_acc:0.7739

大紀元一百八十零分之一十五 191s - 損失:0.7442 - ACC:0.8034 - val_loss:0.7284 - val_acc :0.8018

大紀元一百八十零分之十六 192s - 損失:0.7439 - ACC:0.8187 - val_loss:0.7516 - val_acc:0.8103

大紀元一百八十零分之十七 191s - 損失:0.7401 - ACC:0.8323 - val_loss:0.7966 - val_acc:0.7945

大紀元180分之18 192s - 損失:0.7451 - ACC:0.8392 - val_loss:0.7601 - val_acc:0.8328

大紀元一百八十零分之十九 191s - 損失:0.7653 - ACC:0.8471 - val_loss:0.7776 - val_acc: 0.8243

大紀元一百八十零分之二十零 191s - 損失:0.7514 - ACC:0.8553 - val_loss:0.8367 - val_acc:0.8170

大紀元一百八十零分之二十一 191s - 損失:0.7580 - ACC:0.8601 - val_loss:0.8336 - val_acc:0.8219

大紀元180分之22 192s - 損失:0.7639 - ACC:0.8676 - val_loss:0.8226 - val_acc:0.8438

大紀元一百八十零分之二十三 191s - 損失:0.7599 - ACC:0.8767 - val_loss:0.8618 - val_acc:0.8280

大紀元一百八十零分之二十四 191s - 損失:0.7632 - ACC:0.8761 - val_loss:0.8367 - val_acc:0.8426

大紀元一百八十零分之二十五 191s - 損失:0.7651 - ACC:0.8769 - val_loss:0.8520 - val_acc: 0.8365

Epoch 26/180 191s - 損失:0.7713 - ACC:0.8815 - val_loss:0.8770 - val_acc:0.8316

等等.....

損失增加,精度也越來越高(訓練和驗證)

因爲我使用的是softmax分類器,所以起始損失約爲0.69(-ln(0.5))是合理的,但是這裏的損失高於此值。

我很困惑這是否合適或不合適。 任何人都可以告訴我這裏發生了什麼?

感謝提前:)

+0

你檢查你的預測是什麼?你可能會得到同樣的預測。這也是一個大型網絡。你是否先嚐試一個Conv2D圖層並測試結果? – DJK

+0

我還沒有嘗試過。將嘗試。但這是否過度配合? –

+0

是的,當你的火車損失小於你的驗證損失時,發生這種情況,但是你有更大的問題,因爲你的損失會隨着時間的推移而增加,這不應該發生,因爲這是一個最小化問題。很難說出什麼問題。你也只提供你的網絡,但你應該包括你的數據處理,以便其他人可以看到整個方法。 – DJK

回答

3

對於二元分類,你可以嘗試改變這個你預測層:

model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
+0

我很困惑。這與我得到的結果有什麼關係?你能解釋一下嗎? –

+0

您只是爲您的用例選擇了錯誤的體系結構。我只能推測你關於你的設置的訓練值(因爲你沒有提供'model.compile()'中選擇的損失和指標的詳細信息。 – petezurich

+0

model.compile(loss ='categorical_crossentropy',optimizer = optimizers.Adam (),metrics = ['accuracy']) –

相關問題