Tensorflow 推理结果取决于训练批中图像的顺序

Tensorflow 推理结果取决于训练批中图像的顺序,tensorflow,Tensorflow,我在同一个5幅图像的数据集上对同一网络进行了两次训练。这是第一次,每个步骤的批处理中的图像顺序相同。这是第二次,在每一个训练步骤之前,该批次都被洗牌。两种型号都过合适。这两个模型都在训练数据集中的随机图像上进行了测试。 firs模型显示了100%的准确性。 ``` ``` 第二个模型显示精度接近随机猜测。 ``` ``` 相关问题-无 环境: Ubuntu 14.04 64位 CUDA 8.0 cuDNN 5.1 来自pip的tensorflow 0.12.1,支持GPU 数据集 来自MNI

我在同一个5幅图像的数据集上对同一网络进行了两次训练。这是第一次,每个步骤的批处理中的图像顺序相同。这是第二次,在每一个训练步骤之前,该批次都被洗牌。两种型号都过合适。这两个模型都在训练数据集中的随机图像上进行了测试。 firs模型显示了100%的准确性。 ```

```

第二个模型显示精度接近随机猜测。 ```

```

相关问题-无

环境:
  • Ubuntu 14.04 64位
  • CUDA 8.0
  • cuDNN 5.1
  • 来自pip的tensorflow 0.12.1,支持GPU
数据集 来自MNIST的5幅图像

附件档案 包含可复制示例的代码

  • runner.py负责准备映像批并维护队列
  • network.py包含简单神经网络的代码(2个带relu激活的卷积层,softmax输出层)
  • train_not_shuffled.py使用非无序批处理对网络进行训练和测试
  • train_shuffled.py使用shuffled批处理对网络进行训练和测试


我多次对模型进行了重新培训,尝试了不同的数据集和网络架构。我将图形可视化,以确保推理使用相同的变量。我还可视化了权重,它们在两种情况下看起来略有不同,但不包含任何可以解释这种行为的异常情况。

错误在测试代码中。这条线

images_batch = images_batch.eval()
labels_batch = labels_batch.eval()
单独运行,因此图像和标签实际上来自不同批次。如果批次相同,则标签对应于图像,测试结果完美无瑕。另一方面,当批次被洗牌时,测试预测会与错误的标签进行比较,因此结果很差。 将上面的两行替换为

images_batch, labels_batch = sess.run(train_runner.get_inputs())

修复了问题。

您说两个模型都过拟合,所以它们在训练数据上都接近100%的准确度?我会考虑在测试中与错误的标签进行比较,即输出模型的预测并查看它正在查看的图像,并将它分类为使用相同的代码来测试这两种模型,因此在这两种情况下标签都会混合。事实上,我的第一个猜测是错误的标签顺序或洗牌时的一些错误,所以我仔细检查了它们。你们发现两个模型都过拟合,这意味着它们在训练集上接近完美。但是你说你在你的训练集上测试过,接近随机。因此,您在建议检查什么时混淆了测试内容:-在这两种情况下都使用训练数据集进行测试。具体而言,请使用相同的副本。然后,测试的准确性应与培训的准确性相匹配。-将批大小更改为1以进行测试。精度是否取决于批量大小?除非您不使用批标准化或其他利用批统计的算法,否则这可能会提供进一步的见解。培训和测试图像通过不同的路径到达网络。当测试图像通过feed dict到达占位符时,从队列中获取训练图像。这可以解释为什么推理结果与训练不同,但不能解释为什么它们依赖于训练批中的顺序。
images_batch = images_batch.eval()
labels_batch = labels_batch.eval()
images_batch, labels_batch = sess.run(train_runner.get_inputs())