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

使用Oxford 102花卉数据集训练CNN时出现输入形状不匹配错误

问题根源与解决方案

1. 核心错误:双重批处理导致输入维度异常

image_dataset_from_directory已经通过batch_size参数完成了批处理,你后续再次调用train_dataset.batch(batch_size)和valid_dataset.batch(batch_size),会让数据集的每个元素变成嵌套的批次,输入形状从(32,224,224,3)变成(32,32,224,224,3),这和模型期望的输入形状完全不匹配。

修复方法:直接删除重复的批处理代码:

# 删掉这两行重复的batch调用
# train_dataset = train_dataset.batch(batch_size)
# valid_dataset = valid_dataset.batch(batch_size)

2. 潜在问题:数据集类别数不匹配

从数据集加载输出能看到:

Found 8189 files belonging to 1 classes.

但Oxford 102花卉数据集应该包含102个类别,这说明你的dataset_dir路径大概率不正确。正确的数据集结构应该是:

dataset_dir/
    class_0/
        img1.jpg
        img2.jpg
        ...
    class_1/
        ...
    ...
    class_101/

请检查数据集路径,确保指向包含102个子文件夹的根目录,否则模型最后一层的102类输出会和标签的1类不匹配,后续训练还会出现损失计算错误。

3. 验证修复后的完整流程

修改后的数据集加载代码:

# Define the path to the dataset directory
dataset_dir = "/content/drive/MyDrive/jpg"  # 确保路径指向正确的根目录

# Define batch size and image size
batch_size = 32
img_size = (224, 224)

# Use image_dataset_from_directory to load the dataset
train_dataset = tf.keras.utils.image_dataset_from_directory(
    dataset_dir,
    labels="inferred",
    label_mode="categorical",
    image_size=img_size,
    batch_size=batch_size,
    validation_split=0.2,
    subset="training",
    seed=1337,
)

valid_dataset = tf.keras.utils.image_dataset_from_directory(
    dataset_dir,
    labels="inferred",
    label_mode="categorical",
    image_size=img_size,
    batch_size=batch_size,
    validation_split=0.2,
    subset="validation",
    seed=1337,
)

# 只保留归一化操作,删除重复批处理
train_dataset = train_dataset.map(lambda x, y: (x / 255.0, y))
valid_dataset = valid_dataset.map(lambda x, y: (x / 255.0, y))

之后重新运行模型定义和训练代码,就能解决输入形状不匹配的问题,同时确保类别数正确后,模型的损失计算也能正常进行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:02:38