Keras技术咨询:fit_generator训练后能否用predict做图像预测?
关于Keras中model.predict和model.predict_generator的疑问解答
嘿,刚接触Keras的话,这个问题确实很常见,我来给你梳理清楚~
1. 能不能用model.predict?当然可以!
完全没问题,但有个关键前提:你需要把所有测试图像预处理成符合模型输入要求的张量/NumPy数组,并且能一次性加载到内存里。比如你可以用PIL/OpenCV把测试图读进来,统一尺寸、做归一化(和训练时的预处理逻辑完全一致),然后拼成一个形状为(num_samples, height, width, channels)的数组,直接调用:
predictions = model.predict(test_data_array)
这种方式代码简洁,速度也快,适合测试数据量不大的场景。
2. model.predict_generator的用法(附新版替代方案)
首先要明确:在较新的TensorFlow Keras版本中,predict_generator已经被标记为**弃用(deprecated)**了,官方推荐直接用model.predict来接收生成器输入,用法和predict_generator几乎一致。不过如果你用的是旧版Keras,还是得了解它的用法:
核心逻辑
它是和训练时的fit_generator配套的,用来处理流式生成的测试数据——也就是不用一次性把所有测试数据加载到内存,而是通过生成器逐批读取、预处理后喂给模型。
用法示例
假设你写了一个测试数据生成器(注意:测试生成器不要加数据增强,预处理逻辑必须和训练生成器完全一致!):
def test_data_generator(): for img_path in test_img_paths: img = load_and_preprocess(img_path) # 和训练时的预处理完全一样 yield img
然后调用predict_generator(旧版):
# steps参数是生成器要生成的批次数,比如测试集有1000张图,每批32张,steps=1000//32 + 1 predictions = model.predict_generator(test_data_generator(), steps=32)
而新版Keras直接用predict即可:
predictions = model.predict(test_data_generator(), steps=32)
3. 为什么两者预测结果会有差异?
文献提到的差异,几乎都是预处理不一致导致的,和函数本身无关:
- 如果你用
model.predict时,测试数据的预处理(比如归一化、尺寸调整)和训练生成器里的不一样,结果肯定会差很多; - 测试生成器如果不小心开启了数据增强(比如随机翻转、裁剪),而predict用的是原始图像,那预测结果自然不同;
- 极少数情况是生成器的
shuffle参数导致的:如果测试生成器开了shuffle=True,而你用predict时数据是按顺序加载的,那预测结果的顺序会对应不上,但单张图的预测值应该是一致的(前提预处理相同)。
4. 哪种方式更优?
分场景选择:
- 小数据集:优先用
model.predict,代码简单直观,减少出错概率,速度也更快; - 大数据集/流式数据:用生成器+
model.predict(新版),避免内存溢出,适合处理海量测试图像。
内容的提问来源于stack exchange,提问作者liuzhi316
相关产品推荐
相关产品推荐

