我正在尝试使用深度学习来预测来自约会网站的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])
这是准确性和损失的一个例子: 和。
我们试图消除正规化和辍学,这正如预期的那样,以过度拟合结束(培训acc:~85%)。我们甚至试图以相似的结果大幅降低学习率。
有没有人见过类似的结果?
答案 0 :(得分:31)
当您使用Dropout
时会发生这种情况,因为训练和测试时的行为是不同的。
训练时,一部分功能设置为零(在您使用Dropout(0.5)
时,在您的情况下为50%)。测试时,使用所有功能(并进行适当缩放)。因此,测试时的模型更加稳健 - 并且可以提高测试精度。
答案 1 :(得分:9)
您可以查看Keras FAQ,尤其是部分“为什么培训损失远高于测试损失?”。
我还建议您花一些时间阅读非常好 article关于构建NN时应始终考虑的一些“健全性检查”。
此外,只要有可能,请检查您的结果是否合理。例如,在具有分类交叉熵的n级分类的情况下,第一个时期的损失应为-ln(1/n)
。
除了您的具体情况,我相信除了Dropout
之外,数据集拆分有时可能会导致这种情况。特别是如果数据集拆分不是随机的(在存在时间或空间模式的情况下),验证集可能与列车基本上不同,即噪声较小或方差较小,因此更容易预测,从而导致验证集上的更高精度而不是训练。
此外,如果验证集与训练相比非常小,那么随机模型比训练更适合验证集。]
答案 2 :(得分:8)
这实际上是一种常见的情况。如果您的数据集中没有那么多的变化,您可能会有这样的行为。 Here你可以找到解释为什么会发生这种情况的原因。
答案 3 :(得分:4)
这表示数据集中存在高偏差。这是不合适的。要解决的问题是: -
可能网络正在努力适应训练数据。因此,试试吧 网络有点大。
尝试使用其他深度神经网络。我的意思是说改变架构 一点。
训练时间较长。
尝试使用高级优化算法。
答案 4 :(得分:0)
发生这种情况的原因有很多。您没有显示有关训练,验证和测试的数据大小的任何信息。如果验证集很小,则不能充分代表数据的概率分布。如果您的训练集很小,则没有足够的数据来充分训练模型。此外,您的模型非常基础,可能不足以涵盖数据的复杂性。对于这样的受限模型,退出率最高为50%。尝试使用已建立的模型,例如MobileNet版本1。对于非常复杂的数据关系而言,这已经足够了。一旦可行,您就可以对数据充满信心,并根据需要建立自己的模型。 事实是验证损失和准确性直到您的训练准确性才真正有意义 变得相当高,例如85%。
答案 5 :(得分:0)
我通过简单地增加 epochs 的数量来解决这个问题