我恢复的Tensorflow图像分类器为所有输入输出相同的预测,除非我使用OpenCV翻转图像并同时将原始图像和镜像传递给模型。只传递一个或另一个导致相同的预测。为什么会这样?
import cv2
import numpy as np
# Import restored Tensorflow model
sess = tf.Session()
saver.restore(sess, checkpoint_file_path)
graph = tf.get_default_graph()
make_logits = graph.get_operation_by_name("logits")
logits = make_logits.outputs[0]
image = np.random.rand(240, 320, 3)
flipped = cv2.flip(random_image, 1)
print(logits.eval(feed_dict={x: [image]}, session=sess))
# result: [[-0.0784276 0.40849224 0.01139636]]
print(logits.eval(feed_dict={x: [image,flipped]}, session=sess))
# result: [[ 2.49520946 2.34099054 -3.41013908]
# [-2.6520648 -1.52400601 3.43293166]]
print(logits.eval(feed_dict={x: [flipped]}, session=sess))
# result: [[-0.0784276 0.40849224 0.01139636]]
该模型具有很高的准确性,并且我有一个平衡的数据集,所以它并不是每次都只是预测大多数类。训练和测试误差都会随着时间的推移而减少,所以我认为拟合过程是可以的。为了它的价值,我通过翻转图像(以及它们的标签)来增加我的训练数据集,但我不明白为什么这会产生影响。
丑陋的黑客/解决方法是始终输入图像 - 镜像对,然后只获取原始结果并丢弃镜像的结果。当我这样做时,模型具有高精度,但解决方案感觉很荒谬。