训练准确率急剧上升,测试准确率趋于稳定

在按照这篇文章训练卷积神经网络时,训练集的准确率增长过快,而测试集的准确率趋于稳定。

下面是一个示例,使用了6400个训练样本,每个周期随机选择(因此有些样本可能在之前的周期中已经出现过,有些可能是新的),以及6400个相同的测试样本

对于更大的数据集(64000或100000个训练样本),训练准确率的增长更为明显,第三个周期就达到了98。

我还尝试了在每个周期使用相同的6400个训练样本,只是随机打乱。结果不出所料,效果更差。

epoch 3  loss 0.54871 acc 79.01 learning rate 0.1nr_test_examples 6400    TEST epoch 3  loss 0.60812 acc 68.48 nr_training_examples 6400tb 91epoch 4  loss 0.51283 acc 83.52 learning rate 0.1nr_test_examples 6400TEST epoch 4  loss 0.60494 acc 68.68 nr_training_examples 6400tb 91epoch 5  loss 0.47531 acc 86.91 learning rate 0.05nr_test_examples 6400TEST epoch 5  loss 0.59846 acc 68.98 nr_training_examples 6400tb 91epoch 6  loss 0.42325 acc 92.17 learning rate 0.05nr_test_examples 6400TEST epoch 6  loss 0.60667 acc 68.10 nr_training_examples 6400tb 91epoch 7  loss 0.38460 acc 95.84 learning rate 0.05nr_test_examples 6400TEST epoch 7  loss 0.59695 acc 69.92 nr_training_examples 6400tb 91epoch 8  loss 0.35238 acc 97.58 learning rate 0.05nr_test_examples 6400TEST epoch 8  loss 0.60952 acc 68.21

这是我的模型(我在每次卷积后使用RELU激活):

conv 5x5 (1, 64)max-pooling 2x2dropoutconv 3x3 (64, 128)max-pooling 2x2dropoutconv 3x3 (128, 256)max-pooling 2x2dropoutconv 3x3 (256, 128)dropoutfully_connected(18*18*128, 128)dropoutoutput(128, 128)

可能的原因是什么?

我使用了带学习率衰减的动量优化器:

    batch = tf.Variable(0, trainable=False)    train_size = 6400    learning_rate = tf.train.exponential_decay(      0.1,                # 基础学习率。      batch * batch_size,  # 当前数据集的索引。      train_size*5,          # 衰减步长。      0.5,                # 衰减率。      staircase=True)    # 使用简单动量进行优化。    optimizer = tf.train.MomentumOptimizer(learning_rate,                                         0.9).minimize(cost, global_step=batch)

回答:

这是很正常的现象。这种问题称为过拟合。当你的模型开始“记忆”训练样本,而没有真正学会对测试集有用的知识时,就会出现这种情况。实际上,这就是我们一开始使用测试集的原因。因为如果我们有足够复杂的模型,我们总能完美地拟合数据,即使这种拟合没有意义。测试集正是用来告诉我们模型实际学到了什么的工具。

使用验证集也很有用,它类似于测试集,但你可以用它来决定何时停止训练。当验证误差不再降低时,你就停止训练。为什么不使用测试集来做这个呢?测试集是用来知道你的模型在现实世界中的表现如何的。如果你开始使用测试集的信息来调整训练过程,那就相当于作弊,你的测试误差将不再能代表现实世界的误差,你会因此受到惩罚。

最后,卷积神经网络以其过拟合的能力而臭名昭著。研究表明,即使你打乱标签,甚至是使用随机像素,Conv-nets也能达到零训练误差。这意味着Conv-net可以学习表示并不存在的真实模式。因此,你必须对conv-net进行正则化。也就是说,你必须使用像Dropout批量归一化提前停止这样的方法。

如果你想了解更多,我留下了几个链接:

过拟合、验证、提前停止https://elitedatascience.com/overfitting-in-machine-learning

Conv-nets拟合随机标签:https://arxiv.org/pdf/1611.03530.pdf(这篇论文有点高级,但值得浏览一下)

P.S. 为了真正提高测试准确率,你需要更改模型或使用数据增强进行训练。你也可以尝试使用迁移学习。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注