TensorFlow问题:训练MLP后无法正确获取测试样本预测值
问题分析与解决办法
你遇到的问题核心其实很明确:你两段代码都是在计算测试集真实标签的类别索引,根本没有调用模型的预测输出!
让我拆解一下:
tf.argmax(labels_test, 1)这个操作只依赖于labels_test本身,和你feed_dict里传入的X(测试数据)、dropout_keep_prob(dropout保留概率)完全没有关系。所以不管加不加feed_dict,运行结果自然一模一样——因为你从始至终都在处理真实标签,而不是模型的预测结果。
正确的做法
你需要针对模型的输出张量来做tf.argmax操作,才能得到模型对测试数据的预测类别。举个常见的例子:
假设你的MLP最后一层输出被定义为logits(比如logits = tf.matmul(final_dense_layer, weights) + biases),那正确获取预测值的代码应该是:
# 获取模型对测试数据的预测类别 predicted_classes = sess.run(tf.argmax(logits, 1), feed_dict={X: data_test, dropout_keep_prob: 1.}) # 获取测试集的真实类别(用来和预测值对比) true_classes = sess.run(tf.argmax(labels_test, 1))
这样predicted_classes才是模型根据data_test输出的预测结果,和true_classes对比就能评估模型性能了。
额外注意点
- 确保你已经完成了模型的训练:也就是已经通过
session.run执行过训练步骤,更新了模型的权重参数,否则预测结果会是初始随机参数的输出,毫无意义。 - 确认
labels_test确实是测试集的真实标签数据,避免数据混淆。
内容的提问来源于stack exchange,提问作者user1670773




