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

Google Colab使用ResNet时decode_predictions访问错误数据问题

问题排查结论

核心原因

  • 你加载的keras.applications.resnet50.ResNet50默认加载的是ImageNet数据集预训练权重,ImageNet一共包含1000个通用类别,根本没有你自定义的18个地标分类,配套的decode_predictions方法本身就是用来解析ImageNet 1000类的预测结果的,自然只会返回cup、starfish这类ImageNet里的类别,不可能识别你的自定义地标。
  • 输入预处理逻辑错误:tf.keras.preprocessing.image_dataset_from_directory返回的图像张量本身已经是0255范围的浮点值,你在调用`preprocess_input`前又乘以255,导致输入像素值范围变成065025,完全不符合ResNet50的输入要求,进一步加剧了预测结果混乱。

正确实现自定义地标分类的步骤

1. 改造ResNet50模型结构

不要直接用原始带ImageNet顶层的ResNet50,要去掉顶层分类头,替换为适配你18个类别的输出层:

# 加载无顶层的预训练ResNet50
base_model = keras.applications.ResNet50(
    weights='imagenet',
    include_top=False, # 去掉ImageNet专用的顶层分类层
    input_shape=(224,224,3)
)
# 冻结base_model的权重,先只训练顶层分类层
base_model.trainable = False

# 搭建自定义分类头
model = models.Sequential([
    base_model,
    GlobalAveragePooling2D(),
    Dropout(0.5),
    Dense(18, activation='softmax') # 对应你的18个地标类别
])

2. 修正数据预处理逻辑

调整图像尺寸为224*224,删除多余的乘255操作:

# 加载数据集时直接用224*224尺寸
img_height = 224
img_width = 224

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split = 0.2,
    subset = "training",
    seed = 42,
    image_size= (img_height, img_width),
    batch_size = batch_size
)
# 验证集同理调整尺寸

# 预处理输入不需要乘255
def preprocess_fn(image, label):
    return keras.applications.resnet.preprocess_input(image), label

train_ds = train_ds.map(preprocess_fn)
validation_ds = validation_ds.map(preprocess_fn)

3. 训练后执行预测

模型在你的数据集上完成训练后,直接取预测结果的最大概率索引,对应你自己的class_names列表即可,不需要调用decode_predictions:

# 预测示例
Y_proba = model.predict(images)
pred_labels = np.argmax(Y_proba, axis=1)
# 直接映射到自定义类别
pred_class_names = [class_names[i] for i in pred_labels]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:15:03