如何在Keras中利用ImageDataGenerator和predict_generator预测单张JPEG概率?
嘿,这个问题我做项目时也碰到过,其实核心就是让ImageDataGenerator能正确输出单张图的批量数据,再传给predict_generator就行。下面给你两种实用的方法,按需选就行:
方法一:用flow_from_directory(快速上手)
这种方法适合不想写太多预处理代码的场景,只需要临时建个简单的目录结构:
创建临时目录结构
因为flow_from_directory要求图片放在「类别子文件夹」下,哪怕只有一张图,我们可以建个临时目录:temp/ placeholder_class/ your_image.jpg这里
placeholder_class只是个占位的类名,随便起就行。初始化和训练时一致的
ImageDataGenerator
重点!预测时的预处理必须和训练时完全匹配,比如训练时用了rescale=1./255,那预测时也得加,不能漏:from keras.preprocessing.image import ImageDataGenerator # 和训练时的预处理保持一致,比如训练时用了rescale,这里就同样设置 test_datagen = ImageDataGenerator(rescale=1./255)生成单张图的生成器
配置生成器参数,注意target_size要和模型输入尺寸一致:# 假设你的模型输入是(224,224,3),就设置target_size=(224,224) single_img_generator = test_datagen.flow_from_directory( directory='temp/', target_size=(224, 224), batch_size=1, class_mode=None, # 不需要标签,只输出图片数据 shuffle=False # 关闭打乱,保证顺序正确 )用
predict_generator预测
因为只有一张图,steps设为1就行:# 加载你训练好的模型 from keras.models import load_model model = load_model('your_trained_model.h5') predictions = model.predict_generator(single_img_generator, steps=1) # predictions就是模型输出的概率数组,比如二分类会得到[[0.15, 0.85]],对应两个类别的概率
方法二:直接处理单张图(不用临时文件夹)
如果不想建临时目录,可以手动处理图片后用flow方法生成器:
读取并预处理单张图
from keras.preprocessing.image import load_img, img_to_array import numpy as np # 读取图片并调整尺寸到模型输入大小 img = load_img('your_image.jpg', target_size=(224, 224)) # 转换成数组 img_array = img_to_array(img) # 增加一个维度,变成批量格式(1, height, width, channels) img_batch = np.expand_dims(img_array, axis=0)用
ImageDataGenerator标准化图片
同样要和训练时的预处理一致:test_datagen = ImageDataGenerator(rescale=1./255) # 对单张图做标准化 img_batch = test_datagen.standardize(img_batch)生成器并预测
single_generator = test_datagen.flow(img_batch, batch_size=1, shuffle=False) predictions = model.predict_generator(single_generator, steps=1)
几个关键注意点
- 预处理必须一致:训练时用了什么归一化、标准化,预测时必须完全相同,不然结果会不准。
- 输入尺寸匹配:
target_size必须和模型的输入层尺寸一致,否则会报错。 - 新版本Keras提示:如果你的Keras版本比较新,
predict_generator已经被标记为弃用了,直接用model.predict(single_generator)效果是一样的。
内容的提问来源于stack exchange,提问作者Osho Agyeya
相关产品推荐
相关产品推荐

