You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已完成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:19:51