使用MobileNetV2做猫狗分类训练时出现Input is empty的InvalidArgumentError报错
错误原因
该错误产生于数据加载阶段,image_dataset_from_directory 读取图片时遇到了文件大小为0、内容损坏、后缀名伪装成图片的无效文件,图片解码节点因为输入为空直接抛出异常,和模型实现代码无关。
修复方案
- 方案1:提前清理数据集中的无效文件,在加载数据集前运行以下代码:
import os import PIL from PIL import Image dataset_dir = "dataset/PetImages/" invalid_img_list = [] # 遍历两个类别的图片文件夹 for class_folder in ["Cat", "Dog"]: folder_path = os.path.join(dataset_dir, class_folder) for img_file in os.listdir(folder_path): img_path = os.path.join(folder_path, img_file) try: # 校验图片可正常打开 img = Image.open(img_path) img.verify() # 额外校验文件非空 if os.path.getsize(img_path) == 0: invalid_img_list.append(img_path) except (PIL.UnidentifiedImageError, IOError): invalid_img_list.append(img_path) # 批量删除无效图片 for path in invalid_img_list: os.remove(path) print(f"共清理无效图片{len(invalid_img_list)}张")
- 方案2:(适配TensorFlow 2.10及以上版本)直接在数据集加载接口添加容错参数,加载时自动跳过损坏文件,无需提前清理:
修改原代码中数据集加载部分,新增skip_on_error=True参数:
train_dataset = image_dataset_from_directory(directory, shuffle=True, batch_size=BATCH_SIZE, image_size=IMG_SIZE, validation_split=0.2, subset='training', seed=42, skip_on_error=True) validation_dataset = image_dataset_from_directory(directory, shuffle=True, batch_size=BATCH_SIZE, image_size=IMG_SIZE, validation_split=0.2, subset='validation', seed=42, skip_on_error=True)
- 可选优化:给验证集也添加prefetch配置,提升训练阶段的读取效率:
validation_dataset = validation_dataset.prefetch(buffer_size=AUTOTUNE)
完成上述修改后重新运行训练代码即可正常执行。
内容的提问来源于stack exchange,提问作者maryam gh
相关产品推荐
相关产品推荐

