【问题标题】:keras CNN : train and validation set are identical but with different accuracykeras CNN:训练集和验证集相同但精度不同
【发布时间】:2018-08-29 08:17:13
【问题描述】:

我知道这是一件非常糟糕的事情,但我发现使用 keras mobilenet 时有些奇怪:

我使用相同的数据进行训练和验证集:

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
    class_mode = "categorical"
)
validation_generator = train_datagen.flow_from_directory(
  train_dir,
  target_size=(IM_WIDTH, IM_HEIGHT),
  class_mode = "categorical"
)

但我没有得到相同的准确性!

epoch 30/30 - loss: 0.3485 - acc: 0.8938 - val_loss: 1.7545 - val_acc: 0.4406

与验证集相比,我似乎过度拟合了训练集。但它们应该是相同的!这怎么可能?

【问题讨论】:

标签: tensorflow keras deep-learning


【解决方案1】:

训练损失是即时计算的,只有在训练 epoch 之后才计算验证损失。因此,在开始时,一个几乎未经训练的网络会使训练损失比实际情况更糟。这种影响应该在以后的时期消失,因为那时一个时期对得分的影响不再那么大了。

此行为在 keras faq 中得到解决。 如果您在 epoch 结束时使用自己编写的回调对两者进行评估,它们应该是相同的。

【讨论】:

  • 我不明白你的回答。在 epoch 结束之前和之后的计算不应该有很大的差异。我应该准确地说我不使用 dropout,并且在 10 个 epoch 之后,CNN 明显开始过度拟合训练集(acc > 0.9),它在验证集上仍处于 ~0.4。
  • 嗯,你说得对,我忽略了你在谈论 30. epoch 的事实。虽然它仍然是正确的,但损失和验证损失不应该完全相同,这确实是出乎意料的行为。之前的epochs值如何?
  • 它在大约 5 个 epoch 内开始良好(即两个准确度相似 ~ 0.5),但它开始发散,变得越来越糟。我正在使用 mobilenet 网络,所以可能有一些 dropout 层可以解释一些差异,但它不应该那么奇怪......如果 dropouts 层是问题,它甚至会相反
  • 我同意 dropout 部分。所以 0.5 的准确度确实意味着网络不知道数据中的任何内容。由于您的训练数据开始过度拟合,但验证数据却没有,最可能的原因是您的标签在训练或验证数据集中混淆了。
【解决方案2】:

对于一段时间后阅读本文的人: 我仍然不明白这个问题是如何发生的,但它有助于处理批量大小(减少它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2018-04-13
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多