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

