比使用Tensorflow和Keras训练准确性更高的验证准确性
classification
keras
machine-learning
neural-network
10
0

我正在尝试使用深度学习从约会网站的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])

这是准确性和损失的一个示例: 带有250个神经元的隐藏层的精度亏损

我们已尝试消除正则化和辍学现象,正如预期的那样,结果以过度拟合告终(培训acc:约85%)。我们甚至试图大幅度降低学习率,并取得相似的结果。

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

您可以查看Keras常见问题解答 ,尤其是“为什么培训损失比测试损失高得多?”部分。

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

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

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

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

收藏
评论

这实际上经常是一种情况。当您的数据集中没有太多方差时,您可能会具有以下行为。 在这里您可以找到解释为什么会发生这种情况。

收藏
评论

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

训练时,功能的百分比将设置为零(由于使用Dropout(0.5) ,因此您的情况为50%)。测试时,将使用所有功能(并适当缩放)。因此,测试时的模型更加健壮-可以导致更高的测试准确性。

收藏
评论

这表明数据集中存在高偏差。这是不合适的。发出的解决方案是:

  1. 网络可能正在努力适应训练数据。因此,请尝试使用更大的网络。

  2. 尝试使用其他的深度神经网络。我的意思是说要稍微改变架构。

  3. 训练更长的时间。

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号