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

时间:2017-01-27 17:22:00

标签: tensorflow

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

Prediction  Labels
[6 1 4 3 7] [6 1 4 3 7]
[3 4 1 7 6] [3 4 1 7 6]
[6 1 4 3 7] [6 1 4 3 7]
[4 3 7 6 1] [4 3 7 6 1]
[4 7 6 3 1] [4 7 6 3 1]
[1 3 7 6 4] [1 3 7 6 4]
[3 1 6 7 4] [3 1 6 7 4]

```

第二个模型显示准确接近随机猜测。 ```

Prediction  Labels
[1 4 3 6 7] [7 4 6 3 1]
[3 6 4 1 7] [7 4 3 1 6]
[1 6 3 7 4] [1 6 4 3 7]
[4 7 3 6 1] [1 6 4 3 7]
[3 6 7 4 1] [4 1 3 7 6]
[1 3 7 4 6] [6 3 4 7 1]
[1 4 7 3 6] [3 7 1 4 6]

```

相关问题 - 无

环境:

  • Ubuntu 14.04 64位
  • CUDA 8.0
  • cuDNN 5.1
  • 来自支持GPU的pip
  • tensorflow 0.12.1

数据集

来自MNIST的5张图片

附件档案

包含可重现示例的代码。

  • runner.py负责准备图片批次并维护队列。
  • network.py包含简单神经网络的代码(2个带relu激活的卷积层,softmax输出层)
  • train_not_shuffled.py使用非混洗批次训练和测试网络
  • train_shuffled.py使用混洗批次训练和测试网络

example.gz

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

1 个答案:

答案 0 :(得分:0)

错误在于测试代码。这行

images_batch = images_batch.eval()
labels_batch = labels_batch.eval()

单独运行,因此图像和标签实际上来自不同的批次。如果批次相同,则标签对应图像,测试结果完美。另一方面,当批次洗牌时,将测试预测与错误标签进行比较,结果很差。 用

替换上面的两行
images_batch, labels_batch = sess.run(train_runner.get_inputs())

修复了问题。