验证准确度高于使用Tensorflow和Keras的训练准确度

vmpqdwk3  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(207)

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

这是一个精确度和损失的例子:x1c 0d1x和

中的一个或多个。
我们已经尝试去除正规化和辍学,正如预期的那样,最终导致过度拟合(培训acc:~85%)。我们甚至尝试大幅降低学习率,也得到了类似的结果。
有人看到过类似的结果吗?

nhhxz33t

nhhxz33t1#

当您使用Dropout时会发生这种情况,因为训练和测试时的行为不同。
训练时,将某个百分比的特征设置为零(在您的示例中为50%,因为您使用的是Dropout(0.5))。测试时,将使用所有特征(并进行适当缩放)。因此,测试时的模型更加稳健,并且可以带来更高的测试准确度。

huus2vyu

huus2vyu2#

您可以查看Keras FAQ,尤其是“为什么训练损失比测试损失高得多?"部分。
我还建议您花些时间阅读这篇 * 非常好 * 的文章,它涉及一些在构建NN时应该始终考虑的“健全性检查”。
另外,如果可能的话,检查你的结果是否有意义。例如,在一个n类分类的情况下,第一个时期的损失应该是-ln(1/n)
除了你的具体情况,我相信除了Dropout,数据集分裂有时可能会导致这种情况。特别是如果数据集分裂不是随机的(在存在时间或空间模式的情况下),验证集可能是根本不同的,即更少的噪声或更少的方差,从训练,因此更容易预测,导致更高的准确性验证集比训练。
此外,如果验证集与训练集相比非常小,则随机地,模型比训练集更好地拟合验证集。]

cbeh67ev

cbeh67ev3#

这表明您的数据集中存在高偏倚。它是欠拟合的。该问题的解决方案是:-
1.可能网络正在努力适应训练数据。因此,尝试一个稍微大一点的网络。
1.尝试一个不同的深度神经网络。我的意思是说改变一下架构。
1.训练时间更长。
1.尝试使用高级优化算法。

uajslkp6

uajslkp64#

这实际上是一种很常见的情况。当数据集没有太多的变化时,你可能会有这样的行为。在这里你可以找到为什么会发生这种情况的解释。

vx6bjr1n

vx6bjr1n5#

可能发生这种情况的原因有很多:您没有显示任何有关训练数据大小的信息,验证和测试。如果验证集太小,则无法充分表示数据的概率分布。如果定型集太小,则没有足够的数据来充分定型模型。此外,您的模型非常基本,可能不足以涵盖数据的复杂性。对于这样一个有限的模型,50%的损失是很高的。尝试使用一个成熟的模型,如MobileNet版本1。它将超过足够的,甚至非常复杂的数据关系。一旦工作,然后你可以对数据有信心,并建立自己的模型,如果你愿意。事实是验证损失和准确性没有真实的的意义,直到你的训练准确性达到合理的高,如85%。

rbl8hiat

rbl8hiat6#

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

qaxu7uf2

qaxu7uf27#

在你的模型中加入辍学因素会使它更具普遍性,但这并不一定是原因,可能是因为你的数据不平衡(有偏差),这就是我的想法。

liwlm1x9

liwlm1x98#

我不认为这是一个辍学层的问题。
我认为它与数据集中的图像数量更相关。
这里的要点是,您正在处理一个大的训练集和一个太小的验证/测试集,因此后者太容易计算。
尝试data augmentation和其他技术来获得更大的数据集!

相关问题