更高的验证精度,比训练精度使用 Tensorflow 和 Kera

我正在尝试使用深度学习来预测来自约会网站的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 neurons和 < img src = “ https://i.stack.imgur.com/TH6Nr.png”alt = “ the loss”>。

我们已经尝试去除常规化和辍学,正如预期的那样,结果是过度适应(训练评分: ~ 85%)。我们甚至试图大幅度降低学习速度,结果也差不多。

有人见过类似的结果吗?

75472 次浏览

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

在训练时,一定百分比的特性被设置为零(在您的情况下是50% ,因为您使用的是 Dropout(0.5))。测试时,使用所有特性(并适当地扩展)。因此,该模型在测试时具有较强的鲁棒性,可以提高测试精度。

这种情况经常发生。当你的数据集中没有这么多的变化时,你可以有这样的行为。你可以找到一个解释为什么会发生这种情况。

这表明在你的数据集中存在高偏差。这是不合适的。解决问题的办法是:-

  1. 可能网络正在努力适应训练数据 更大一点的网络

  2. 试试不同的深度神经网络,我是说改变架构 一点点

  3. 长时间的训练。

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

您可以检查 Kera 常见问题,特别是 “为什么训练损失比测试损失高得多?”部分。

我也建议你花一些时间,并阅读这个 非常好 文章关于一些“理智检查”,你应该总是考虑在建立一个神经网络。

此外,只要有可能,检查你的结果是否有意义。例如,在 n 类分类与分类交叉熵的情况下,第一个纪元的损失应该是 -ln(1/n)

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

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

出现这种情况的原因有很多。您没有显示关于培训、验证和测试数据大小的任何信息。如果验证集过小,则不能充分代表数据的概率分布。如果训练集很小,则没有足够的数据来充分训练模型。此外,您的模型非常基本,可能不足以覆盖数据的复杂性。对于这样一个有限的型号,下降50% 是很高的。尝试使用已建立的模型,如 MobileNet 版本1。即使对于非常复杂的数据关系来说,这也足够了。一旦这种方法奏效,那么您就可以对数据充满信心,并且如果您愿意的话,还可以构建自己的模型。 事实是确认损失和准确性没有真正的意义,直到你的训练准确性 比如说85% 。

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

将辍学添加到模型中可以使它更加一般化,但它不一定是原因。这可能是因为你的数据不平衡(有偏见) ,这就是我的想法。.

我不认为这是一个退出层的问题。

我认为这更多地与数据集中的图像数量有关。

这里的要点是,您正在处理一个大型训练集和一个太小的验证/测试集,因此后者太容易计算了。

尝试 数据增强和其他技术,以获得您的数据集更大!