在按照这篇文章训练卷积神经网络时,训练集的准确率增长过快,而测试集的准确率趋于稳定。
下面是一个示例,使用了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. 为了真正提高测试准确率,你需要更改模型或使用数据增强进行训练。你也可以尝试使用迁移学习。