在验证准确度提高的同

时间:2017-07-14 09:57:27

标签: optimization keras

我正在使用keras和tensorflow训练CNN进行二值图像分类(每个15k样本)。

这是我的模特:

#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)))

我使用Adam(设置为keras文档中给出的默认值)作为优化器。 当我开始训练模型时,它开始表现得非常奇怪。

Epoch 14/180 191s - 损失:0.7426 - acc:0.7976 - val_loss:0.7306 - val_acc:0.7739

大纪元15/180 191s - 损失:0.7442 - acc:0.8034 - val_loss:0.7284 - val_acc:0.8018

大纪元16/180 192s - 损失:0.7439 - acc:0.8187 - val_loss:0.7516 - val_acc:0.8103

大纪元17/180 191s - 损失:0.7401 - acc:0.8323 - val_loss:0.7966 - val_acc:0.7945

大纪元18/180 192s - 损失:0.7451 - acc:0.8392 - val_loss:0.7601 - val_acc:0.8328

大纪元19/180 191s - 损失:0.7653 - acc:0.8471 - val_loss:0.7776 - val_acc:0.8243

大纪元20/180 191s - 损失:0.7514 - acc:0.8553 - val_loss:0.8367 - val_acc:0.8170

时代21/180 191s - 损失:0.7580 - acc:0.8601 - val_loss:0.8336 - val_acc:0.8219

大纪元22/180 192s - 损失:0.7639 - acc:0.8676 - val_loss:0.8226 - val_acc:0.8438

大纪元23/180 191s - 损失:0.7599 - acc:0.8767 - val_loss:0.8618 - val_acc:0.8280

大纪元24/180 191s - 损失:0.7632 - acc:0.8761 - val_loss:0.8367 - val_acc:0.8426

大纪元25/180 191s - 损失:0.7651 - acc:0.8769 - val_loss:0.8520 - val_acc:0.8365

时代26/180 191s - 损失:0.7713 - acc:0.8815 - val_loss:0.8770 - val_acc:0.8316

依旧.....

增加的损失和准确性也在增加(培训和验证)

由于我使用的是softmax分类器,因此获得起始损失~0.69(-ln(0.5))是合乎逻辑的,但这里的损失高于此值。

我很困惑这是否过度拟合。 谁能告诉我这里发生了什么?

提前致谢:)

3 个答案:

答案 0 :(得分:3)

对于二进制分类,您可以尝试将其更改为预测层:

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

答案 1 :(得分:0)

首先,将二进制交叉熵用于二进制分类,其次,您需要调整学习速度,我认为您的学习速度的价值很大。

P.S。如果您能告诉我们您使用的是什么图像,那将会很有帮助。

答案 2 :(得分:0)

您将显示第14个或更高版本的数据。对于以前的时期,您的损失是否单调减少?如果确实如此,那么这些较高时期的行为就不会那么异常,尤其是在您没有使用可调学习率的情况下。损失会增加但准确性也会提高的情况并不少见。它们的计算方法完全不同,请尝试使用keras.callbacks.callbacks.ReduceLROnPlateau提供的内置Keras学习速率调节器。根据您选择监视的指标,这将降低您的学习率。您可以认为损失函数是N空间中的一个谷,当您接近最小值时,该函数会变窄(请参见附图)如果您在接近最小值时学习率太大(请参见图中的箭头),则您的损失将不再单调减少但实际上开始上升。Loss Function