如何用Keras的ImageDataGenerator加载无分类子文件夹的手写阿拉伯字母数据集
问题原因
flow_from_directory()的核心逻辑是从分类子文件夹中读取图片并自动识别类别,你的所有图片都直接放在dataset/train根目录下,没有按类别划分到子文件夹,所以它无法识别任何类别和图片,才会返回Found 0 images belonging to 0 classes.。
解决方案
下面提供两种实用的解决方法,你可以根据需求选择:
方法1:先将图片按标签分类到子文件夹
如果之后想继续用flow_from_directory(),可以先写个简单脚本,从文件名提取标签,自动创建子文件夹并移动图片:
import os import shutil train_dir = 'dataset/train' # 遍历目录下所有文件 for filename in os.listdir(train_dir): if filename.endswith('.png'): # 从文件名提取标签(示例从id_1_label_1.png中提取label_1) # 请根据你的实际文件名格式调整分割逻辑 label = filename.split('_')[2] # 创建标签对应的子文件夹 label_dir = os.path.join(train_dir, label) os.makedirs(label_dir, exist_ok=True) # 移动图片到对应子文件夹 src_path = os.path.join(train_dir, filename) dst_path = os.path.join(label_dir, filename) shutil.move(src_path, dst_path)
运行完这个脚本后,你的数据集会变成dataset/train/label_1、dataset/train/label_2这样的结构,再运行你原来的flow_from_directory()代码就能正常识别类别和图片了。
方法2:使用flow_from_dataframe()加载(无需移动图片)
如果不想改动数据集结构,可以用Keras的flow_from_dataframe()方法,它支持通过DataFrame指定图片路径和对应标签:
import pandas as pd import os from keras.preprocessing.image import ImageDataGenerator train_dir = 'dataset/train' # 1. 生成包含图片路径和标签的DataFrame file_list = [] label_list = [] for filename in os.listdir(train_dir): if filename.endswith('.png'): file_list.append(filename) # 提取标签,请根据实际文件名格式调整 label = filename.split('_')[2] label_list.append(label) df = pd.DataFrame({ 'filename': file_list, 'label': label_list }) # 2. 初始化ImageDataGenerator train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True ) # 3. 使用flow_from_dataframe加载数据 training_set = train_datagen.flow_from_dataframe( dataframe=df, directory=train_dir, x_col='filename', y_col='label', target_size=(64, 64), batch_size=32, class_mode='categorical' )
运行这段代码后,training_set会正确识别所有图片和对应的类别,输出类似Found X images belonging to Y classes.的信息。
注意:两种方法中,标签提取的逻辑需要根据你的实际文件名格式调整,如果文件名格式和示例不同,要修改分割索引或用正则表达式提取标签。
内容的提问来源于stack exchange,提问作者David Magdy
相关产品推荐
相关产品推荐

