在 tensorflow 训练和测试中显示不同的结果

Posted

技术标签:

【中文标题】在 tensorflow 训练和测试中显示不同的结果【英文标题】:In tensorflow training and test shows different results 【发布时间】:2018-12-23 22:48:54 【问题描述】:

现在我在 tensorflow 中遇到了一个问题: 我有一个由 6 个卷积层组成的网络(每个卷积层都进行批量归一化,最后一个卷积之后是平均池化以使输出形状为 Nx1x1xC),旨在将一张图像分类为一个类别。训练期间一切正常: - 训练样本约为 150000 - 训练期间的验证样本约为 12000

我已经训练了总共 50000 次迭代,小批量大小为 6。 - 在训练期间,训练损失总是越来越低(从开始时的大约 2.6 到迭代 50000 时的大约 0.3), - 并且在大约 40000 次迭代后验证准确率越来越高并达到饱和(从开始时的 60% 到迭代 50000 时的 72%)

但是,当我在相同的验证样本上使用迭代 50000 的学习权重进行测试时,总体准确度仅为 40% 左右。如果有人遇到类似问题,我已经用谷歌搜索了。有人说批量标准化中移动平均线的衰减可能是原因。

tf.contrib.layers.batch_norm 中的默认衰减为 0.999。然后我用 0.9、0.99、0.999 的衰减进行了训练。测试过程中验证样本的OA结果分别为70%、30%、39%。虽然 0.9 的衰减效果最好,但在训练期间的验证上仍然低于 OA。

我写信是想问是否有人有类似的问题,你知道可能是什么原因吗?

祝你好运,

【问题讨论】:

我的猜测是,由于某种原因,您正在执行的两个图表不同。可能导致差异的还有 dropout:您在训练评估期间是否使用了 dropout?尝试找到两个预测不同的示例,并深入挖掘以了解发生了什么。激活是一样的吗? 我检查过的两张图是一样的,我不使用dropout。仍然非常感谢您的建议! 【参考方案1】:

我有两个建议:

    如果您没有使用bool isTraining 并将其传递给批量标准化层,请这样做!这应该是一个占位符,并在每个会话之前设置(在训练中将设置为 true,在测试/验证中设置为 false)。 检查在测试/验证期间,您没有打乱您的 tet/验证数据集(在某些批量数据的导入/管理中可能存在某种 shuffle=True)。 第一个是关键,第二个不应该有太大的区别,但它可以确保每次都有准确的数字值。

【讨论】:

至第 2 点:测试/验证期间的数据集未洗牌

以上是关于在 tensorflow 训练和测试中显示不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?

请问我用TensorFlow 加载已经训练好的模型,测试不同图像输出都一样是什

如何在 TensorFlow 中使用我自己的数据将图像拆分为测试和训练集

TensorFlow 同时调用多个预训练好的模型

TensorFlow实现鸢尾花分类

TensorFlow实现鸢尾花分类