TensorFlow中sess.run每次返回相同输出标签的问题求助
我看了你的代码,这里有几个可能导致每次调用sess.run都返回相同数组的问题,你可以一步步排查:
变量名笔误:你代码里定义了
y_pred = tf.get_default_graph().get_tensor_by_name('y_pred:0'),但后面sess.run(pred, ...)里用的是pred——这明显是个错误!应该改成sess.run(y_pred, ...),不然你可能在运行一个未正确定义的张量(如果之前有其他地方定义了常量pred,就会一直返回固定值)。输入维度不匹配:你的
X是形状(784,)的placeholder,但通常TensorFlow模型训练时会使用批量输入(比如形状(None, 784),None代表批量大小)。如果训练时模型的输入是批量维度在前,那喂单个样本时需要把imageprepare返回的(784,)数组增加一个批量维度,改成(1, 784)的形状。试试这样修改:img = imageprepare('jean.jpeg') # 增加批量维度 img_batch = img.reshape(1, 784) output_label = sess.run(y_pred, feed_dict={X: img_batch})维度不匹配时,模型可能会静默地用错误逻辑处理输入,导致输出固定。
检查
imageprepare的输出:你要确认这个函数处理不同图片时,返回的(784,)数组是否真的不同。比如可以打印imageprepare('jean.jpeg')的内容,再换一张图打印对比——如果两次输出完全一样,那问题出在预处理环节:可能是图片路径错误(一直读同一张图或读不到图返回默认值),或者预处理逻辑有问题(比如没做归一化、错误地把所有像素设为同一个值)。验证模型恢复的正确性:确认
y_pred:0是训练时正确定义的张量名。训练时可以用print(y_pred.name)输出张量全名,避免恢复时拿到的是常量或无关张量。另外,也可以在恢复模型后打印图中所有张量名,确认y_pred:0存在:for tensor in tf.get_default_graph().get_operations(): print(tensor.name)确认图重置生效:虽然你用了
tf.reset_default_graph(),但要确保每次调用predict()时,这个操作都正确重置了计算图,避免残留的旧张量干扰结果。
你先从这些点入手,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者Rachit

