tf.keras训练MIT室内场景数据集时报Input size差2错误如何解决?
报错根因
你遇到的Input size should match (header_size + row_size * abs_height) but they differ by 2错误和模型结构、损失函数、尺寸调整逻辑完全无关,是MIT Indoor Scene数据集中存在少量文件损坏/后缀与实际格式不匹配/头信息错误的图片,image_dataset_from_directory底层调用的TensorFlow原生DecodeImage接口对异常文件兼容性极低,读到坏图就会直接抛出错误,跑几个batch才报错是因为坏图刚好混在后面的批次里。
修复步骤
1. 过滤/修复数据集中的损坏图片
运行以下脚本遍历所有数据集图片,自动识别并删除损坏文件,同时可以统一转换为RGB格式避免单通道灰度图后续报错:
import os from pathlib import Path from PIL import Image # 替换为你自己的数据集路径 DATA_PATH = Path.cwd().joinpath('data', 'Images') bad_files = [] # 遍历所有类别子目录 for class_dir in DATA_PATH.iterdir(): if not class_dir.is_dir(): continue # 遍历目录下所有图片文件 for img_path in class_dir.glob('*.*'): try: # 验证图片完整性 with Image.open(img_path) as img: img.verify() # 二次打开确认可正常转RGB,避免灰度/四通道图问题 with Image.open(img_path) as img: img.convert('RGB') except Exception as e: bad_files.append(img_path) print(f"损坏文件:{img_path}, 错误信息:{str(e)}") print(f"\n共识别到{len(bad_files)}个损坏文件,输入y确认删除:") if input().strip().lower() == 'y': for f in bad_files: os.remove(f) print("所有损坏文件已删除")
2. 调整数据集加载参数
给image_dataset_from_directory补充color_mode='rgb'参数,强制读取为3通道图片,避免自动检测格式时输出单通道灰度图和模型输入不匹配:
train = tf.keras.utils.image_dataset_from_directory( DATA_PATH, validation_split=0.2, subset="training", labels="inferred", label_mode="categorical", color_mode="rgb", # 新增参数,强制输出3通道 seed=123, image_size=(img_height, img_width), batch_size=batch_size ) # 验证集的加载逻辑也要加相同的color_mode参数 valid = tf.keras.utils.image_dataset_from_directory( DATA_PATH, validation_split=0.2, subset="validation", labels="inferred", label_mode="categorical", color_mode="rgb", seed=123, image_size=(img_height, img_width), batch_size=batch_size )
3. 删除冗余逻辑
你已经在image_dataset_from_directory中指定了image_size参数,框架会自动完成图片缩放,后续额外加的Resizing层调用完全冗余,可以直接删掉对应的map操作。
完成以上三步后重新运行训练代码即可解决该报错。
内容的提问来源于stack exchange,提问作者bhola prasad
相关产品推荐
相关产品推荐

