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
相关产品推荐
相关产品推荐

