2017-06-12 252 views
3

我在keras中使用了一個改編的LeNet模型來進行二元分類。我有大約25萬訓練樣本,比例爲60/40。我的模特訓練得很好。第一個時代的精度達到97%,損失0.07。 10個紀元後,精度超過99%,損失爲0.01。我正在使用CheckPointer來保存我的模型,當他們改進時。Keras:模型精度在達到99%的準確度和損失後下降0.01

大約在第11個時代,精度下降到55%左右,損失了6左右。這怎麼可能?是因爲模型不能更準確,它試圖找到更好的權重,但完全沒有這樣做?

我的模型是對LeNet模型的適配:

lenet_model = models.Sequential() 
lenet_model.add(Convolution2D(filters=filt_size, kernel_size=(kern_size, kern_size), padding='valid',\ 
         input_shape=input_shape)) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Convolution2D(filters=64, kernel_size=(kern_size, kern_size), padding='valid')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Convolution2D(filters=128, kernel_size=(kern_size, kern_size), padding='valid')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Flatten()) 
lenet_model.add(Dense(1024, kernel_initializer='uniform')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(Dense(512, kernel_initializer='uniform')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(Dropout(0.2)) 
lenet_model.add(Dense(n_classes, kernel_initializer='uniform')) 
lenet_model.add(Activation('softmax')) 

lenet_model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy']) 
+0

這是培訓準確性還是驗證準確性下降?它不能只是找到新的權重,因爲梯度下降不會讓權重突然變化。 – michetonu

+0

該模型在所有變量上進行了訓練,所以在這種情況下我不使用驗證數據。 –

+3

嘗試將'loss'更改爲'categorical_crossentropy'。或者改變輸出以使'dim = 1'和'activation =「softmax」'。 –

回答

3

問題在施加binary_crossentropy損失,而在這種情況下categorical_crossentropy應適用騙。另一種方法是將binary_crossentropy丟失,但將輸出更改爲dim=1並將其激活爲sigmoid。奇怪的行爲來自事實,即使用binary_crossentropy多類二元分類(有兩類)實際上已解決,而您的任務是單類二元分類。