TensorFlow模型predict()方法批量预测数据集结果异常,单样本预测却符合精度预期的原因排查
嘿,我一眼就揪出问题的核心了:你批量预测时的输入预处理逻辑和训练/逐样本预测时完全不一致,差了最关键的一步——像素值的归一化转换!
问题到底出在哪?
你训练和逐样本预测时,通过tf.image.convert_image_dtype(ds_row['image'], dtype=tf.float32)把图片从原始的uint8格式(像素值0-255)转换成了float32(像素值0-1范围),这一步是让模型输入符合训练分布的关键。但看你批量预测的代码,只对图片做了resize,完全没做这个类型转换,导致输入给模型的还是0-255的原始像素值。
你的MobileNetV2顶层分类器是基于0-1范围的输入训练出来的,突然喂进去数值大了255倍的输入,模型的激活层直接乱套,输出自然就完全失真,看起来跟没训练过一样。
怎么修复?
把批量预测的预处理逻辑和训练时对齐就行,两种方式都可以:
方式1:复用训练时的preprocess函数
直接用你已经写好的preprocess,只提取图片部分:
test_images = dataset['test'].map(lambda x: preprocess(x)[0]).batch(1)
方式2:单独写预测用的预处理函数
如果不想复用全量逻辑,也可以单独写一个简化版:
def preprocess_for_pred(x): # 和训练时一样,先转成float32再resize image = tf.image.convert_image_dtype(x['image'], dtype=tf.float32) image = tf.image.resize(image, (IMG_LEN, IMG_LEN), method='nearest') return image test_images = dataset['test'].map(preprocess_for_pred).batch(1)
为什么其他场景正常?
- 逐样本预测时你调用了
preprocess(dog),自动完成了类型转换,输入符合模型预期; model.evaluate(val_batches)用的是经过prepare处理的数据集,包含了完整的preprocess步骤,输入范围完全正确。
改完之后再跑批量预测,结果应该就和逐样本、evaluate的精度一致了!
内容的提问来源于stack exchange,提问作者mstreffo
相关产品推荐
相关产品推荐

