训练损失增加,而验证准确性增加



我正在使用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)))

我正在使用亚当(设置为 keras 文档中给出的默认值(作为优化器。 当我开始训练模型时,它的行为开始奇怪。

Epoch 14/180
191s - loss: 0.7426 - acc: 0.7976 - val_loss: 0.7306 - val_acc: 0.7739
Epoch 15/180
191s - loss: 0.7442 - acc: 0.8034 - val_loss: 0.7284 - val_acc: 0.8018
Epoch 16/180
192s - loss: 0.7439 - acc: 0.8187 - val_loss: 0.7516 - val_acc: 0.8103
Epoch 17/180
191s - loss: 0.7401 - acc: 0.8323 - val_loss: 0.7966 - val_acc: 0.7945
Epoch 18/180
192s - loss: 0.7451 - acc: 0.8392 - val_loss: 0.7601 - val_acc: 0.8328
Epoch 19/180
191s - loss: 0.7653 - acc: 0.8471 - val_loss: 0.7776 - val_acc: 0.8243
Epoch 20/180
191s - loss: 0.7514 - acc: 0.8553 - val_loss: 0.8367 - val_acc: 0.8170
Epoch 21/180
191s - loss: 0.7580 - acc: 0.8601 - val_loss: 0.8336 - val_acc: 0.8219
Epoch 22/180
192s - loss: 0.7639 - acc: 0.8676 - val_loss: 0.8226 - val_acc: 0.8438
Epoch 23/180
191s - loss: 0.7599 - acc: 0.8767 - val_loss: 0.8618 - val_acc: 0.8280
Epoch 24/180
191s - loss: 0.7632 - acc: 0.8761 - val_loss: 0.8367 - val_acc: 0.8426
Epoch 25/180
191s - loss: 0.7651 - acc: 0.8769 - val_loss: 0.8520 - val_acc: 0.8365
Epoch 26/180
191s - loss: 0.7713 - acc: 0.8815 - val_loss: 0.8770 - val_acc: 0.8316

等等.....

损失增加,准确性也在增加(训练和验证(。

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

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

对于二元分类,您可以尝试将预测图层更改为此分类:

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

首先使用二进制交叉熵进行二进制分类,其次你需要调整学习率,我认为你的学习率的价值是很大的。

附言如果您能告诉我们您正在使用的图像是什么,那将很有帮助。

显示纪元 14 及更高时期的数据。对于以前的时期,您的损失是否单调减少?如果是这样,那么这些较高纪元的行为并不罕见,特别是如果您不使用可调整的学习率。损失可能会增加,但准确性也会增加的情况并不少见。它们是通过完全不同的方法计算的。尝试使用作为keras.callbacks.callbacks.ReduceLROnPlateau提供的内置学习速率调节器。这将根据您选择监控的指标降低您在 epoch 上的学习率。您可以将损失函数视为 N 空间中的一个谷,当您接近最小值时,该谷会变窄(见附图( 如果您在接近最小值时学习率太大(见图中的箭头(,您的损失将不再单调减少,而是实际上开始上升。损失函数

最新更新