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

Keras 2中predict_generator输出不一致问题求助(batch数非整数)

解决Keras 2 predict_generator预测概率不一致的问题

嘿,我太懂这种被一个小bug卡两个月的憋屈感了!刚好我之前也踩过Keras里predict_generator的这个坑,给你几个实打实的解决办法:

问题根源

核心问题出在**最后一个batch的样本数不足batch_size(64)**时,predict_generator会默认返回长度为batch_size的预测数组,但多出来的部分其实是无效的重复/错误值,这就导致你得到的probs1包含了多余的错误预测,和正确的probs2对不上。

具体解决方案

方案1:手动计算步数并截取正确结果

这是最直接的修复方式,先明确总样本数,计算需要的步数,最后截取对应数量的预测结果:

import numpy as np

# 获取测试集总样本数
total_test_samples = len(batches.filenames)
# 计算需要的步数:向上取整总样本数/batch_size
steps = np.ceil(total_test_samples / 64).astype(int)
# 执行预测
probs1 = model.predict_generator(batches, steps=steps)
# 截取前total_test_samples个结果,去掉最后batch多出来的无效值
probs1 = probs1[:total_test_samples]

⚠️ 注意:一定要确保测试生成器设置了shuffle=False,否则预测结果的顺序会和样本对应不上,还是会出现不一致的情况。

方案2:改用model.predict直接处理生成器

Keras 2后期版本其实已经推荐直接用model.predict()接收生成器,行为比predict_generator更稳定,同样配合步数和截取:

probs1 = model.predict(batches, steps=steps)
probs1 = probs1[:total_test_samples]

方案3:加载全部测试数据到内存(内存允许时)

如果你的测试集数据量不大,直接把所有数据加载到内存里用predict,完全避开生成器的batch问题:

# 循环读取生成器的所有batch
x_test = []
for i in range(len(batches)):
    batch_x, _ = batches[i]
    x_test.append(batch_x)
# 拼接成完整的测试集
x_test = np.concatenate(x_test)
# 直接预测
probs1 = model.predict(x_test)

额外提示

predict_generator在Keras的新版本里已经被标记为弃用了,建议尽量使用model.predict()替代,后续维护和兼容性更好。

内容的提问来源于stack exchange,提问作者Jenia Golbstein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:30:42