You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Keras图像识别:含猫图片model.predict返回[[0.]]的问题求助

解决Keras模型预测猫图片返回[[0.]]的问题

嘿,我懂你的困扰——训练和验证集跑起来都没问题,但一拿含猫的测试图跑model.predict()就一直返回[[0.]]?这十有八九是测试图片的预处理流程和模型训练时的预处理没对齐,这是计算机视觉模型部署时超常见的坑!咱们一步步排查可能遗漏的点:

1. 图像缩放(Rescale)是否和训练时完全一致?

训练时如果用了ImageDataGenerator(rescale=1./255)把像素值缩到0-1区间,那测试图片必须做一模一样的操作!要是测试图直接读出来就丢给模型,像素值还是0-255的范围,模型会把这些值当成异常大的输入,自然输出会偏向0。

举个正确的处理示例:

from keras.preprocessing import image
import numpy as np

# 这里要和训练时的参数完全匹配
img_height, img_width = 150, 150  # 比如训练时target_size设的是这个
rescale_factor = 1./255

# 读取图片
img = image.load_img(filePath, target_size=(img_height, img_width))
# 转成数组
img_array = image.img_to_array(img)
# 执行缩放
img_array *= rescale_factor

2. 目标尺寸(Target Size)是否匹配?

训练时用flow_from_directory或者其他生成器时指定的target_size,测试时load_img必须用完全相同的尺寸!比如训练时设的是(224,224),测试时却用默认尺寸读图,输入张量的形状和模型预期的不一样,哪怕模型不报错,输出结果也完全不可靠。

3. 颜色通道模式(Color Mode)有没有搞错?

如果训练时用了color_mode='grayscale'(单灰度通道),但测试时默认读成RGB三通道,或者反过来,都会导致输入通道数不匹配,模型输出直接乱掉。一定要确认训练时的color_mode,测试时对应设置:

# 比如训练时是灰度图,测试时也要这么读
img = image.load_img(filePath, color_mode='grayscale', target_size=(img_height, img_width))

4. 别忘了增加批量维度!

Keras模型默认接受批量输入,也就是输入张量的形状是(batch_size, height, width, channels),但单张图片读出来的形状是(height, width, channels),少了batch维度。这时候必须用np.expand_dims补上,不然model.predict()的结果会异常:

# 在缩放之后加上这行
img_array = np.expand_dims(img_array, axis=0)
# 再执行预测
prediction = model.predict(img_array)

5. 确认标签映射是不是搞反了?

最后别忘了检查训练时的标签映射!比如用flow_from_directory时,标签是按文件夹顺序自动分配的,假设你的训练集里猫的文件夹排在第二个,那猫对应的标签可能是1,而不是0。这时候[[0.]]其实是模型预测这张图不是猫?不对,你说这是含猫的图,那可能你搞反了标签含义。可以打印训练生成器的class_indices看看:

print(train_generator.class_indices)
# 输出比如 {'dog': 0, 'cat': 1},那模型输出接近1才是猫

总结一下

核心原则就是:测试图片的预处理流程必须和训练时的预处理完全对齐,从尺寸、缩放、通道数到输入维度,一个细节都不能错。按照上面的步骤排查,应该就能解决返回[[0.]]的问题了!

内容的提问来源于stack exchange,提问作者Jeremy Rako

火山引擎 最新活动