【问题标题】:Higher validation accuracy, than training accurracy using Tensorflow and Keras比使用 Tensorflow 和 Keras 的训练准确度更高的验证准确度
【发布时间】:2017-10-14 05:39:58
【问题描述】:

我正在尝试使用深度学习来预测来自约会网站的 15 个自我报告属性的收入。

我们得到了相当奇怪的结果,与我们的训练数据相比,我们的验证数据获得了更高的准确性和更低的损失。这在不同大小的隐藏层中是一致的。 这是我们的模型:

for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]:
    def baseline_model():
        model = Sequential()
        model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001)))
        model.add(Dropout(0.5, seed=seed))
        model.add(Dense(3, kernel_initializer='normal', activation='sigmoid'))

        model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy'])
        return model

    history_logs = LossHistory()
    model = baseline_model()
    history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs])

这是准确性和损失的示例: 和 。

我们已尝试移除正则化和 dropout,正如预期的那样,这会导致过度拟合(训练 acc:~85%)。我们甚至尝试大幅降低学习率,结果相似。

有没有人看到类似的结果?

【问题讨论】:

标签: tensorflow machine-learning neural-network keras classification


【解决方案1】:

在模型中添加 dropout 可以使其更通用,但不一定是原因。这可能是因为您的数据不平衡(有偏见),这就是我的想法..

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
【解决方案2】:

我通过简单地增加 epoch 的数量来解决这个问题

【讨论】:

  • 作为评论似乎更好
【解决方案3】:

发生这种情况的原因有很多。您没有显示任何有关用于训练、验证和测试的数据大小的信息。如果验证集太小,它就不能充分代表数据的概率分布。如果您的训练集很小,则没有足够的数据来充分训练模型。此外,您的模型非常基础,可能不足以涵盖数据的复杂性。对于这样一个有限的模型,下降 50% 是很高的。尝试使用已建立的模型,例如 MobileNet 版本 1。即使是非常复杂的数据关系,它也绰绰有余。一旦可行,您就可以对数据充满信心,并根据需要构建自己的模型。 事实是验证损失和准确性在您的训练准确性之前没有真正的意义 相当高,比如 85%。

【讨论】:

    【解决方案4】:

    您可以查看Keras FAQ,尤其是“为什么训练损失远高于测试损失?”部分。

    我还建议您花一些时间阅读这篇非常好article,其中涉及一些在构建 NN 时应始终考虑的“健全性检查”。

    此外,请尽可能检查您的结果是否有意义。例如,在具有分类交叉熵的 n 类分类的情况下,第一个 epoch 的损失应该是-ln(1/n)

    除了你的具体情况,我相信除了Dropout,数据集拆分有时可能会导致这种情况。特别是如果数据集拆分不是随机的(在存在时间或空间模式的情况下),验证集可能与训练有根本的不同,即更少的噪声或更少的方差,因此更容易预测,从而导致验证集的准确性更高比在训练上。

    此外,如果验证集与训练相比非常小,则随机模型比训练更适合验证集。]

    【讨论】:

      【解决方案5】:

      这表明您的数据集中存在高偏差。它是欠拟合的。问题的解决方案是:-

      1. 可能网络正在努力适应训练数据。因此,尝试一个 大一点的网络。

      2. 尝试不同的深度神经网络。我的意思是说改变架构 有点。

      3. 训练更长时间。

      4. 尝试使用高级优化算法。

      【讨论】:

        【解决方案6】:

        这实际上是很常见的情况。当您的数据集中没有太多差异时,您可能会有这样的行为。 Here 你可以找到为什么会发生这种情况的解释。

        【讨论】:

          【解决方案7】:

          当您使用 Dropout 时会发生这种情况,因为训练和测试时的行为不同。

          训练时,特征的百分比设置为零(在您的情况下为 50%,因为您使用的是Dropout(0.5))。测试时,会使用所有功能(并适当缩放)。因此,测试时的模型更加稳健 - 并且可以带来更高的测试准确度。

          【讨论】:

          • 所以你说如果 val_acc 比 trn_acc 高一点就可以了?
          • 很好地解释了测试错误不如训练错误!现在在 Keras keras.io/getting-started/faq/… 的 FAQ 中,但最初的问题是关于验证准确度高于训练准确度或验证错误低于训练错误。
          • @yhenon 我在构建模型时也会观察到。但我想知道使用 dropout 时是否会发生这种**保证**?这背后有什么理论依据吗?
          • @jtlz2 Keras FAQ URL 的小改动(下划线替换连字符):keras.io/getting_started/faq/…
          • @jtlz2 - 我的理解是问题是验证或测试准确性>培训准确性。换句话说,如果我们接受错误或损失,训练错误>测试错误,FAQ正是关于训练错误>测试错误(这看起来很奇怪,因为通常训练错误
          猜你喜欢
          • 2017-12-21
          • 2021-07-22
          • 2020-07-08
          • 2018-08-16
          • 2018-09-18
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          相关资源
          最近更新 更多