在这文章中训练卷积神经网络时,当测试集的精度稳定时,训练集的精度提高了很多。
下面是一个有6400个训练示例的示例,在每个时代随机选择(因此在前几个时期可能会看到一些示例,有些可能是新的),以及6400 相同的测试示例。
对于较大的数据集(64000或100000个训练例子),训练精度的提高更为突然,在第三个时代达到98。
我也尝试使用--同样的6400个训练例子--每个时代都有,只是随机地混在一起。正如预期的那样,结果更糟。
epoch 3 loss 0.54871 acc 79.01
learning rate 0.1
nr_test_examples 6400
TEST epoch 3 loss 0.60812 acc 68.48
nr_training_examples 6400
tb 91
epoch 4 loss 0.51283 acc 83.52
learning rate 0.1
nr_test_examples 6400
TEST epoch 4 loss 0.60494 acc 68.68
nr_training_examples 6400
tb 91
epoch 5 loss 0.47531 acc 86.91
learning rate 0.05
nr_test_examples 6400
TEST epoch 5 loss 0.59846 acc 68.98
nr_training_examples 6400
tb 91
epoch 6 loss 0.42325 acc 92.17
learning rate 0.05
nr_test_examples 6400
TEST epoch 6 loss 0.60667 acc 68.10
nr_training_examples 6400
tb 91
epoch 7 loss 0.38460 acc 95.84
learning rate 0.05
nr_test_examples 6400
TEST epoch 7 loss 0.59695 acc 69.92
nr_training_examples 6400
tb 91
epoch 8 loss 0.35238 acc 97.58
learning rate 0.05
nr_test_examples 6400
TEST epoch 8 loss 0.60952 acc 68.21这是我的模型(每次卷积后使用RELU激活):
conv 5x5 (1, 64)
max-pooling 2x2
dropout
conv 3x3 (64, 128)
max-pooling 2x2
dropout
conv 3x3 (128, 256)
max-pooling 2x2
dropout
conv 3x3 (256, 128)
dropout
fully_connected(18*18*128, 128)
dropout
output(128, 128)可能是什么原因?
我使用动量优化器和学习速率衰减:
batch = tf.Variable(0, trainable=False)
train_size = 6400
learning_rate = tf.train.exponential_decay(
0.1, # Base learning rate.
batch * batch_size, # Current index into the dataset.
train_size*5, # Decay step.
0.5, # Decay rate.
staircase=True)
# Use simple momentum for the optimization.
optimizer = tf.train.MomentumOptimizer(learning_rate,
0.9).minimize(cost, global_step=batch)发布于 2017-09-14 12:45:03
这是意料之中的事。这个问题被称为过度拟合.这是当您的模型开始“记忆”培训示例,而没有真正学习任何有用的测试集。事实上,这正是我们首先使用测试集的原因。因为如果我们有一个足够复杂的模型,我们总是可以很好地拟合数据,即使不是很有意义。测试集告诉我们模型实际学到了什么。
使用类似于测试集的验证集也很有用,但是您可以使用它来确定何时停止训练。当验证错误停止降低时,您将停止培训。为什么不使用测试集呢?测试集是为了知道您的模型在现实世界中的表现如何。如果您开始使用来自测试集的信息来选择关于您的培训过程的内容,而不是您的作弊,那么您将受到不再代表您真实世界错误的测试错误的惩罚。
最后,卷积神经网络因其过拟合的能力而臭名昭著.已经证明,即使你洗牌标签,甚至随机像素,Conv-网也能得到零训练误差。这意味着,对于Conv来说,不必有真正的模式来学习表示它。这意味着必须对conv-net进行正则化。也就是说,您必须使用诸如Dropout、批处理规范化、早期停止之类的东西。
如果你想读更多,我会留下几个链接:
过度拟合,验证,早期停止https://elitedatascience.com/overfitting-in-machine-learning
配置随机标签的Conv-网:https://arxiv.org/pdf/1611.03530.pdf (本文有点先进,但它的交互作用是浏览)。
为了真正提高你的测试精度,你需要改变你的模型或训练数据增强。你可能也想尝试转移学习。
https://stackoverflow.com/questions/46216981
复制相似问题