已完成Keras训练与验证,如何测试图像并预测categorical class图像?
没问题,我来一步步帮你搞定Keras里的图像测试和结果输出——完全贴合你要的categorical分类、类别名称、准确率这些需求:
第一步:获取训练&测试准确率
首先咱们先把训练和测试阶段的准确率搞出来,这部分很直接:
训练准确率:你用
model.fit()训练时,返回的history对象里存着每一轮的训练指标。拿最后一轮的准确率就行:# 假设你训练时是这么写的 history = model.fit(train_data, train_labels, epochs=15, validation_data=(val_data, val_labels)) # 提取最后一轮的训练准确率 final_train_acc = history.history['accuracy'][-1] print(f"训练准确率: {final_train_acc * 100:.1f} %")注意:如果你的损失函数是
categorical_crossentropy,对应的指标键是accuracy;如果用了其他自定义指标,要换成对应的键名。测试准确率:用
model.evaluate()在独立测试集上计算,这是最靠谱的测试结果:test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=0) print(f"测试准确率: {test_acc * 100:.1f} %")加
verbose=0可以关闭评估时的日志输出,看起来更清爽。
第二步:单张图像的预测流程
这部分是核心,关键是预处理必须和训练时完全一致,不然预测结果会跑偏。假设你已经有了类别名称列表(比如class_names = ['Cat', 'Dog', 'Rabbit'],要和训练时的类别顺序完全匹配)。
1. 加载并预处理单张图像
比如你要预测的图像路径是test_img_path = 'my_dog_photo.jpg',处理代码如下:
from tensorflow.keras.preprocessing import image import numpy as np # 加载图像并调整到模型输入的尺寸(比如你训练时用的224x224) img = image.load_img(test_img_path, target_size=(224, 224)) # 转换成numpy数组 img_array = image.img_to_array(img) # 增加一个维度(模型接受批量输入,形状是(批量数, 高, 宽, 通道数)) img_array = np.expand_dims(img_array, axis=0) # 归一化(和训练时的预处理一致,比如训练时用了rescale=1./255,这里必须同步) img_array /= 255.
2. 执行预测并解析结果
# 得到预测概率,形状是(1, 类别数),每个元素对应类别的概率 predictions = model.predict(img_array, verbose=0) # 找到概率最大的类别索引 predicted_idx = np.argmax(predictions[0]) # 获取对应的类别名称 predicted_class = class_names[predicted_idx] # 计算该类别的置信度百分比 confidence = predictions[0][predicted_idx] * 100 # 按照你要的格式输出 print(f"{predicted_class} : {confidence:.1f} %")
整合所有功能的示例脚本
把上面的逻辑整合起来,你可以写一个复用性强的脚本:
from tensorflow.keras.preprocessing import image import numpy as np # 加载训练好的模型(如果之前保存了的话) # model = tf.keras.models.load_model('my_trained_model.h5') # 你的类别名称列表!!必须和训练时的类别顺序完全一致 class_names = ['Cat', 'Dog', 'Rabbit'] # 打印训练&测试准确率 def print_accuracies(history, test_data, test_labels): final_train_acc = history.history['accuracy'][-1] test_loss, test_acc = model.evaluate(test_data, test_labels, verbose=0) print(f"训练准确率: {final_train_acc * 100:.1f} %") print(f"测试准确率: {test_acc * 100:.1f} %") # 单张图像预测函数 def predict_image(img_path): # 预处理 img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) img_array /= 255. # 预测 predictions = model.predict(img_array, verbose=0) predicted_idx = np.argmax(predictions[0]) return class_names[predicted_idx], predictions[0][predicted_idx] * 100 # 调用示例 # print_accuracies(history, test_data, test_labels) pred_class, pred_conf = predict_image('my_test_photo.jpg') print(f"{pred_class} : {pred_conf:.1f} %")
关键注意事项
- 类别顺序必须严格匹配:比如你用
ImageDataGenerator.flow_from_directory训练时,类别顺序是按文件夹名称字母排序的,你的class_names必须和这个顺序一致,不然预测的类别名称会错。 - 预处理完全同步:如果训练时用了其他预处理(比如色彩归一化、通道转换),预测时只需要做基础的缩放/维度调整,不需要做数据增强(增强是给训练集加多样性的,预测时用原始图像的预处理就行)。
内容的提问来源于stack exchange,提问作者karan
相关产品推荐
相关产品推荐

