Keras flow_from_directory加载单文件夹图片报错:未找到图像与类别
问题根源
flow_from_directory的默认逻辑是要求目标目录下必须存在子文件夹作为类别划分,它会把子文件夹名当作类别,然后统计子文件夹里的图像数量。你直接读取仅含图像的训练文件夹时,找不到符合要求的类别子目录,就会报“Found 0 images belonging to 0 classes”的错误。
解决方法
针对自编码器的训练需求(不需要分类标签,输入即标签),有两种实用方案:
方案1:调整目录结构(最简单)
给训练、验证文件夹各加一个子文件夹(比如命名为normal),把所有图像移到这个子文件夹里,让目录结构变成:
train/ └── normal/ ├── img1.jpg ├── img2.jpg └── ... validation/ └── normal/ ├── imgA.jpg ├── imgB.jpg └── ...
然后修改生成器代码,指定class_mode='input'(自编码器训练时,输入数据就是标签数据):
from tensorflow.keras.preprocessing.image import ImageDataGenerator img_height, img_width = 256, 256 batch_size = 32 train_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'path/to/train', target_size=(img_height, img_width), batch_size=batch_size, class_mode='input' # 关键:输入即标签 ) val_datagen = ImageDataGenerator(rescale=1./255) val_generator = val_datagen.flow_from_directory( 'path/to/validation', target_size=(img_height, img_width), batch_size=batch_size, class_mode='input' )
方案2:用flow_from_dataframe绕过目录结构限制
如果不想改目录结构,可以用flow_from_dataframe,先把图像路径整理成DataFrame,再生成训练数据:
import pandas as pd import os from tensorflow.keras.preprocessing.image import ImageDataGenerator # 整理训练集图像路径 train_dir = 'path/to/train' train_files = [f for f in os.listdir(train_dir) if f.endswith(('.png', '.jpg', '.jpeg'))] train_df = pd.DataFrame({ 'filename': [os.path.join(train_dir, f) for f in train_files], 'label': [os.path.join(train_dir, f) for f in train_files] # 自编码器标签等于输入 }) # 生成训练生成器 train_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_dataframe( dataframe=train_df, x_col='filename', y_col='label', target_size=(256, 256), batch_size=32, class_mode='input', validate_filenames=False ) # 验证集同理复制上述逻辑即可
内容的提问来源于stack exchange,提问作者user22108863
相关产品推荐
相关产品推荐

