首页 文章

比使用Tensorflow和Keras的培训准确性更高的验证准确性

提问于
浏览
11

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

这是准确性和损失的一个例子:Accuracy with hidden layer of 250 neuronsthe loss .

我们试图消除正规化和辍学,这正如预期的那样,以过度拟合结束(培训acc:~85%) . 我们甚至尝试用相似的结果大幅降低学习率 .

有没有人见过类似的结果?

4 回答

  • 16

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

    训练时,一部分功能设置为零(在您使用 Dropout(0.5) 时,在您的情况下为50%) . 测试时,使用所有功能(并进行适当缩放) . 因此,测试时的模型更加稳健 - 并且可以提高测试精度 .

  • 1

    这实际上是一种常见的情况 . 如果您的数据集中没有那么多的变化,您可能会有这样的行为 . Here你可以找到解释为什么会发生这种情况的原因 .

  • 3

    您可以查看Keras FAQ,尤其是"Why is the training loss much higher than the testing loss?"部分 .

    我还建议你花一些时间阅读这篇非常好的article关于一些"sanity checks"你在构建NN时应该总是考虑到这一点 .

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

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

    此外,如果验证集与训练相比非常小,那么随机模型比训练更适合验证集 .

  • 5

    这表明数据集中存在高偏差 . 这是不合适的 . 要解决的问题是: -

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

    • 尝试使用其他深度神经网络 . 我的意思是说改变架构一点 .

    • 训练时间较长 .

    • 尝试使用高级优化算法 .

相关问题