训练准确率大幅增加,测试准确率稳定
Training accuracy increases aggresively, test accuracy settles
根据 this 文章训练卷积神经网络时,训练集的准确性增加太多,而测试集的准确性稳定下来。
下面是一个包含 6400 个训练示例的示例,在每个时期随机选择(因此一些示例可能在以前的时期看到,一些可能是新的),以及 6400 相同的测试例子.
对于更大的数据集(64000 或 100000 个训练示例),训练准确率的增加更加突然,在第三个 epoch 时达到 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)
可能是什么原因?
我正在使用带有学习率衰减的 Momentum Optimizer:
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)
这是非常令人期待的。 这个问题叫做过拟合。这是您的模型开始 "memorizing" 训练示例而实际上没有学习任何对测试集有用的东西的时候。事实上,这正是我们首先使用测试集的原因。因为如果我们有一个足够复杂的模型,我们总能完美地拟合数据,即使没有意义。测试集告诉我们模型实际学到了什么。
使用类似于测试集的[=27=]验证集也很有用,但您可以使用它来确定何时停止训练。当验证错误停止降低时,您将停止训练。 为什么不为此使用测试集? 测试集是为了了解您的模型在现实世界中的表现。如果您开始使用测试集中的信息来选择有关您的训练过程的事情,那么这就像您作弊一样,您将受到惩罚,因为您的测试错误不再代表您在现实世界中的错误。
最后,卷积神经网络因过拟合能力而臭名昭著。已经表明,即使您打乱标签甚至 随机像素 ,Conv-nets 也可以获得零训练错误。这意味着 Conv-net 不必有一个真实的模式来学习表示它。这意味着 你必须正则化一个 conv-net。也就是说,你必须使用 Dropout、batch normalization、early stopping.[=12 之类的东西=]
如果你想阅读更多,我会留下一些链接:
过拟合、验证、提前停止
https://elitedatascience.com/overfitting-in-machine-learning
Conv-nets 拟合随机标签:
https://arxiv.org/pdf/1611.03530.pdf
(这篇论文有点高级,不过略过还是挺有意思的)
P.S。要真正提高测试准确性,您需要更改模型或使用数据扩充进行训练。您可能也想尝试迁移学习。
根据 this 文章训练卷积神经网络时,训练集的准确性增加太多,而测试集的准确性稳定下来。
下面是一个包含 6400 个训练示例的示例,在每个时期随机选择(因此一些示例可能在以前的时期看到,一些可能是新的),以及 6400 相同的测试例子.
对于更大的数据集(64000 或 100000 个训练示例),训练准确率的增加更加突然,在第三个 epoch 时达到 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)
可能是什么原因?
我正在使用带有学习率衰减的 Momentum Optimizer:
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)
这是非常令人期待的。 这个问题叫做过拟合。这是您的模型开始 "memorizing" 训练示例而实际上没有学习任何对测试集有用的东西的时候。事实上,这正是我们首先使用测试集的原因。因为如果我们有一个足够复杂的模型,我们总能完美地拟合数据,即使没有意义。测试集告诉我们模型实际学到了什么。
使用类似于测试集的[=27=]验证集也很有用,但您可以使用它来确定何时停止训练。当验证错误停止降低时,您将停止训练。 为什么不为此使用测试集? 测试集是为了了解您的模型在现实世界中的表现。如果您开始使用测试集中的信息来选择有关您的训练过程的事情,那么这就像您作弊一样,您将受到惩罚,因为您的测试错误不再代表您在现实世界中的错误。
最后,卷积神经网络因过拟合能力而臭名昭著。已经表明,即使您打乱标签甚至 随机像素 ,Conv-nets 也可以获得零训练错误。这意味着 Conv-net 不必有一个真实的模式来学习表示它。这意味着 你必须正则化一个 conv-net。也就是说,你必须使用 Dropout、batch normalization、early stopping.[=12 之类的东西=]
如果你想阅读更多,我会留下一些链接:
过拟合、验证、提前停止 https://elitedatascience.com/overfitting-in-machine-learning
Conv-nets 拟合随机标签: https://arxiv.org/pdf/1611.03530.pdf (这篇论文有点高级,不过略过还是挺有意思的)
P.S。要真正提高测试准确性,您需要更改模型或使用数据扩充进行训练。您可能也想尝试迁移学习。