如何在TensorFlow重训练示例中打印预测概率?
如何在TensorFlow重训练示例中打印所有类别的预测概率?
嘿,我对TensorFlow这个重训练脚本熟得很,要实现你想要的打印每个测试图像所有类别的预测概率,其实只需要调整一下获取预测结果的逻辑就行——原来的代码只拿了预测的类别索引,现在我们要拿到原始的概率分布。
核心思路
原来的prediction变量是通过tf.argmax(final_tensor, 1)得到的类别索引,而final_tensor才是经过softmax输出的、对应每个类别的概率值数组。我们需要在评估时同时获取这个final_tensor的结果,然后把它和类别名称对应起来格式化输出。
具体修改步骤
- 调整评估时获取的张量
找到你原来的评估代码,把只获取prediction改成同时获取final_tensor(也就是模型的softmax概率输出):
# 假设final_tensor是你脚本中定义的softmax输出张量 test_accuracy, predictions, all_probs = eval_session.run( [evaluation_step, prediction, final_tensor], feed_dict={ bottleneck_input: test_bottlenecks, ground_truth_input: test_ground_truth })
- 格式化打印概率信息
接下来,你可以根据需求打印所有图像或者仅误分类图像的概率。比如要打印误分类图像的详细概率:
# 获取所有类别的名称列表 class_names = list(image_lists.keys()) if FLAGS.print_misclassified_test_images: tf.logging.info('=== MISCLASSIFIED TEST IMAGES WITH PROBABILITIES ===') for i, test_filename in enumerate(test_filenames): if predictions[i] != test_ground_truth[i]: # 把每个类别的名称和概率拼接成字符串 prob_str = "; ".join([f"{class_names[j]}: {all_probs[i][j]:.1f}" for j in range(len(class_names))]) # 按你想要的格式输出 tf.logging.info(f'{test_filename:70s} {prob_str}')
如果想要打印所有测试图像的概率,不管是否分类正确,直接去掉判断条件即可:
tf.logging.info('=== ALL TEST IMAGES WITH PREDICTION PROBABILITIES ===') class_names = list(image_lists.keys()) for i, test_filename in enumerate(test_filenames): prob_str = "; ".join([f"{class_names[j]}: {all_probs[i][j]:.1f}" for j in range(len(class_names))]) tf.logging.info(f'{test_filename:70s} {prob_str}')
注意点
- 确保
final_tensor是你脚本中定义的softmax输出张量,通常它的定义类似:final_tensor = tf.nn.softmax(tf.matmul(bottleneck_input, final_weights) + final_biases),别搞错成其他张量了。 - 代码里的
.1f是控制概率的小数位数,和你例子里的格式一致,如果需要更多精度可以改成.2f之类的。
内容的提问来源于stack exchange,提问作者krisg
相关产品推荐
相关产品推荐

