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

ResNet汽车识别模型测试集正常,手动预测输出固定结果求助

问题诊断与解决方案

核心问题分析

模型在批量测试集上表现正常,但单张图片预测时输出固定类别,说明单张图片的预处理流程与训练/测试阶段不一致,导致模型输入分布异常,进而输出无意义的固定结果。

具体修正步骤

1. 对齐预处理顺序(关键)

训练阶段的预处理顺序是:先resize到目标尺寸,再归一化;但你的手动测试代码是先归一化再resize,这会导致像素值的插值计算逻辑与训练时不符。修正后的代码如下:

import tensorflow as tf
import numpy as np

image_path = "pezo2.jpg"

# 1. 读取图像并强制转为3通道RGB(避免灰度图问题)
image = tf.io.read_file(image_path)
image = tf.image.decode_image(image, channels=3)

# 2. 先resize到训练时的目标尺寸,和训练流程一致
target_size = (256, 256)
resized_image = tf.image.resize(image, target_size)

# 3. 再执行归一化,和训练流程一致
normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1.0 / 255)
normalized_image = normalization_layer(resized_image)

# 4. 扩展维度为批量输入格式
image_array = np.expand_dims(normalized_image, axis=0)

# 执行预测
yhat = new_model.predict(image_array)

2. 确认图像通道与维度

  • 手动加载图像时必须强制指定channels=3,避免部分图像是单通道灰度图,导致模型输入维度不匹配(模型要求输入为(None,256,256,3))。
  • 预处理完成后,可以打印image_array.shape确认是否为(1,256,256,3),确保符合模型输入要求。

3. 验证模型加载正确性

虽然测试集评估正常,但可以额外验证加载的模型是否为训练完成的版本:

# 打印模型结构,和训练代码中的结构对比
new_model.summary()
# 对比训练时的最后一层参数数量,确认加载无误
print(new_model.layers[-1].get_weights()[0].shape)  # 应为(512,8)

4. 排查标签映射一致性

训练时image_dataset_from_directory会按文件夹名称字典序生成类别顺序,你可以打印测试集的类别映射,确认预测结果对应的类别是否符合预期:

# 训练时获取类别映射
class_names = data.class_names
print("类别顺序:", class_names)
# 预测时查看对应类别
predicted_class_idx = np.argmax(yhat)
print("预测类别:", class_names[predicted_class_idx])

额外建议

如果上述修正后仍有问题,可以尝试将训练时的归一化层整合到模型中,避免预处理流程不一致:

# 训练时将归一化层加入模型
input_layer = tf.keras.Input(shape=(256,256,3))
x = tf.keras.layers.experimental.preprocessing.Rescaling(1.0/255)(input_layer)
x = resnet_model(x)
# 后续自定义层不变...
model = Model(inputs=input_layer, outputs=predictions)

这样保存的模型会自动处理归一化,手动测试时只需resize图像即可,无需额外归一化步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:57