【问题标题】:training loss increases while validation accuracy increases训练损失增加,而验证准确性增加
【发布时间】:2020-10-07 11:36:05
【问题描述】:

我正在使用 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 - 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)) 的起始损失是合乎逻辑的,但这里的损失要高。

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

【问题讨论】:

  • 你检查你的预测了吗?您可能对所有事情都得到相同的预测。这也是一个大型网络。您是否先尝试了一个 Conv2D 层并测试了结果?
  • 我没试过。会尝试的。但这是过拟合吗?
  • 是的,你过拟合了,当你的训练损失小于验证损失时会发生这种情况,但是你有一个更大的问题,因为你的损失随着时间的推移而增加,这不应该发生,因为这是一个最小化问题。很难说是什么问题。您也只提供您的网络,但您应该包括您的数据处理,以便其他人可以看到整个方法。
  • 数据预处理只涉及减去 3 个通道中的每个通道的平均值(单个数字不是平均图像),以使数据居中为 0。并且没有增强。
  • 你也除以标准差吗?

标签: optimization keras


【解决方案1】:

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

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

【讨论】:

  • 我很困惑。这与我得到的结果有什么关系?你能解释一下吗?
  • 您只是为您的用例选择了错误的架构。我只能推测有关您的设置的训练值(因为您没有在 model.compile() 中提供有关所选损失和指标的详细信息。
  • model.compile(loss= 'categorical_crossentropy',optimizer=optimizers.Adam(),metrics = ['accuracy'])
【解决方案2】:

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

附:如果您能告诉我们您使用的图片是什么,那将会很有帮助。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2021-09-01
      • 1970-01-01
      • 2018-12-15
      • 2020-08-08
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多