TensorFlow/Keras image_dataset_from_directory报NotFoundError求助
解决TensorFlow/Keras image_dataset_from_directory的NotFoundError问题
核心要求:目录结构必须规范
image_dataset_from_directory对数据目录结构有硬性要求,主目录下必须直接包含类别子目录,每个子目录下存放对应类别的图片,不能有额外嵌套或无关文件,示例结构如下:
data/ cat/ cat1.jpg cat2.jpg dog/ dog1.jpg dog2.jpg
正确指定数据路径的方法
用绝对路径
直接写完整路径,避免相对路径的歧义:- Windows系统:
"C:/Users/YourName/Documents/data"或"C:\\Users\\YourName\\Documents\\data" - Linux/macOS系统:
"/home/YourName/data"
- Windows系统:
验证相对路径的正确性
如果用相对路径,先确认当前工作目录是否正确:import os print(os.getcwd()) # 输出当前代码运行的目录确保你的数据目录(比如
data)就在这个目录下,或者用"./data"明确指定相对路径。先验证路径有效性
在调用函数前,先检查路径是否存在,以及目录内容是否符合要求:data_path = "your_data_path" print(os.path.exists(data_path)) # 必须返回True print(os.listdir(data_path)) # 应该看到所有类别子目录
排查与解决步骤
- 检查权限:确保程序有目标目录的读写权限,Linux/macOS下可以用
chmod命令调整;Windows下右键目录,检查“安全”选项卡的权限设置。 - 检查文件完整性:如果是压缩包解压的数据集,确认解压过程没有中断,没有损坏的图片文件。
- 云环境特殊处理:如果在Colab等云平台,确认已经挂载云盘(比如Google Drive)或者数据集已经正确上传到环境中。
- 测试最小示例:创建一个极简的测试目录(比如两个子目录各放1张图片),用函数加载,排查是否是数据集本身的问题。
替代方案:手动加载数据集
如果上述方法都无效,可以用tf.data.Dataset手动实现加载逻辑,灵活性更高:
import os import tensorflow as tf def load_custom_dataset(data_path, image_size=(224,224), batch_size=32): # 获取类别名称和所有图片路径 class_names = [d for d in os.listdir(data_path) if os.path.isdir(os.path.join(data_path, d))] file_paths = [] labels = [] for cls_idx, cls_name in enumerate(class_names): cls_dir = os.path.join(data_path, cls_name) for img_file in os.listdir(cls_dir): file_paths.append(os.path.join(cls_dir, img_file)) labels.append(cls_idx) # 创建并预处理数据集 def preprocess(image_path, label): img = tf.io.read_file(image_path) img = tf.image.decode_jpeg(img, channels=3) # 根据图片格式调整,比如png用decode_png img = tf.image.resize(img, image_size) # 可选:添加自定义预处理,比如归一化 img = img / 255.0 return img, label dataset = tf.data.Dataset.from_tensor_slices((file_paths, labels)) dataset = dataset.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE) dataset = dataset.shuffle(buffer_size=1000).batch(batch_size).prefetch(tf.data.AUTOTUNE) return dataset, class_names # 使用示例 dataset, class_names = load_custom_dataset("your_data_path", (224,224), 32)
内容的提问来源于stack exchange,提问作者SENTHIL KUMAR KJ
相关产品推荐
相关产品推荐

