训练和测试精度之间的差异Tensorflow教程

这个张量流tutorial中的代码使用代码的这一部分来计算验证的准确性吗?

eval_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x": eval_data},
      y=eval_labels,
      num_epochs=1,
      shuffle=False)
  eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)
  print(eval_results)

Question: 因此,如果我必须计算训练集的准确度,以便查看我的模型是否过度拟合我的训练集数据,如果我将 "x" 的值更改为 train_data 并提供训练数据以进行测试,它是否会给我训练设定准确度?

如果没有,我如何检查我的模型是否过度拟合我的数据集?

步数如何影响准确度?就像我训练它20000步然后如果我训练它为另一个100.为什么它会改变准确性?是因为权重再次计算?那样做这样的事情是否明智?

mnist_classifier.train(
      input_fn=train_input_fn,
      steps=20000,
      hooks=[logging_hook])

回答(3)

2 years ago

通常你有3个数据集,1个用于训练,1个用于验证,1个用于测试 . 所有这些数据集必须是唯一的,训练集的图像可能不会出现在验证或测试集等中 . 您使用训练集进行训练,并在每个时期之后,使用验证数据验证模型 . 优化器将始终尝试更新权重以对训练数据进行完美分类,因此训练精度将非常高(> 90) . 验证数据是模型以前从未见过的数据,并且在每个时期(或x个步骤)之后完成,以显示模型对数据的反应程度以前没有见过,这表明模型将在多大程度上提高加班时间 .

训练越多,训练精度就越高,因为优化器会尽力将该值提高到100% . 不更新权重的验证数据也会增加加班时间,但不会持续增加 . 虽然训练准确性不断提高,但验证准确性可能会停止提高 . 验证准确性随着时间的推移而降低的那一刻,那么你就过度拟合了 . 这意味着该模型过于关注训练数据,并且如果它与训练集不同,则无法正确地对另一个角色进行分类 .

在所有培训结束时,您使用测试集,这将确定模型在新数据上的实际准确性 .

@xmacz:我还没有添加评论,只有答案所以我只是更新我的答案 . 是的,我检查了源代码,您的第一行代码在测试数据上测试模型

2 years ago

evaluate 只是一个对输入数据进行一些数值活动并产生一些输出的函数 . 如果您使用它来测试数据,它应该给出测试准确性,如果您输入训练数据,它应该输出训练准确性 .

在一天结束时它只是数学 . 输出是什么 intuitively ,你必须确定 .

2 years ago

如何知道您的模型是否过度拟合是您在训练模型时所做的事情 . 您必须设置另一个名为验证数据集的集合,该集合与测试和培训集不同 . 数据集的典型分割为70%-20%-10%,分别用于培训,测试和验证 .

在培训期间,您将在验证数据集上测试模型的每n个步骤 . 在第一次迭代期间,验证集上的分数会变得更好,但在某些时候它会变得更糟 . 你可以使用这些信息来阻止你的模特开始过度训练时的训练,但做正确的是一门艺术 . 例如,你可以在5次测试后停止,你的准确度一直在下降,因为有时你可以看到它变得更糟,但在下一次测试中它会变得更好 . 很难说,这取决于很多因素 .

关于你的第二个问题,迭代另外100个步骤可能会使你的模型更好或更差,这取决于它是否过度拟合,所以我担心这个问题没有明确的答案 . 权重很少会停止变化,因为迭代/步骤正在“移动”它们,无论好坏 . 同样,很难说如何获得好的结果,但你可以尝试尽早停止使用验证集,正如我之前提到的那样 .