如何导入已训练的Keras CNN模型对单张图片进行预测?
用单张图片测试Keras CNN模型的方法
嘿,我来帮你搞定这个问题!你已经用ImageDataGenerator完成了模型训练,现在要测试单张图片,核心是让测试图片的预处理逻辑和训练时完全对齐,下面是具体步骤:
1. 加载保存好的模型
先把你存的model.h5模型加载进来,用Keras的内置方法就能搞定:
from keras.models import load_model # 加载训练好的模型 model = load_model('model.h5')
2. 预处理单张测试图片
这一步是关键,必须和你训练时ImageDataGenerator的设置完全匹配(比如你用了rescale=1./255和target_size=(image_size, image_size)),具体操作如下:
from keras.preprocessing import image import numpy as np # 替换成你训练时实际用的image_size数值 image_size = 224 # 1. 加载图片:指定和训练一致的尺寸,颜色模式要匹配(训练用RGB就设'rgb',灰度图设'grayscale') img = image.load_img('你的测试图片路径.jpg', target_size=(image_size, image_size), color_mode='rgb') # 2. 将图片转换为数组格式 img_array = image.img_to_array(img) # 3. 扩展维度:因为模型默认接受批量输入(形状为 (batch_size, height, width, channels)),所以要手动加一个batch维度 img_array = np.expand_dims(img_array, axis=0) # 4. 和训练时做同样的归一化处理 img_array /= 255.0
3. 运行预测并解析结果
现在可以把预处理好的图片喂给模型,然后解析预测结果了:
# 执行预测 predictions = model.predict(img_array) # 解析结果:因为你训练时用了class_mode='categorical',predictions是每个类别的概率值 # 如果你之前保存了训练生成器的类别映射,直接用就行;没保存的话可以重新生成一次或者手动定义 # 示例:从训练生成器获取类别映射 # class_indices = train_generator.class_indices # 反转字典得到「索引→类别名称」的映射 # idx_to_class = {v: k for k, v in class_indices.items()} # 取概率最高的类别索引 predicted_idx = np.argmax(predictions[0]) # 对应的类别名称 # predicted_class = idx_to_class[predicted_idx] print(f"各类别预测概率:{predictions[0]}") print(f"预测类别索引:{predicted_idx}") # print(f"预测类别名称:{predicted_class}")
重要提醒
- 测试图片的颜色通道数必须和训练时一致:比如训练用的是RGB(3通道),就别用灰度图(1通道)测试,否则会报错。
- 测试时不要加训练用的数据增强(比如旋转、翻转),只做尺寸调整和归一化就好,不然会干扰预测结果。
- 如果训练时还做了其他预处理(比如均值减法、标准化),测试时必须完全照搬相同逻辑。
内容的提问来源于stack exchange,提问作者DennisShaw
相关产品推荐
相关产品推荐

