2017-06-12 253 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多类二元分类(有两类)实际上已解决,而您的任务是单类二元分类。