Keras ImageDataGenerator无效文件名报错及文件数不符问题咨询
问题排查与解决方案
核心原因说明
出现5个文件差值、生成器报无效文件警告,基本是以下几个问题导致,你的现有校验逻辑存在漏洞没有抓到:
- 校验代码路径硬编码错误:你写的遍历校验代码里
sdir固定写死为"retinopathy_train",但图像生成器实际读取的路径是train_image_dir变量指向的目录,二者路径不一致,你校验的根本不是生成器读取的文件夹,自然抓不到错误。 - cv2.imread 异常捕获逻辑失效:
cv2.imread读取损坏/格式不支持的文件时不会抛出异常,只会返回None,你写的try-except块完全无法捕获这类问题,等于校验无效。 - 文件名匹配规则问题:Colab运行环境是Linux系统,文件名大小写敏感,如果你的csv里
id_col存的文件名后缀是小写.png,但实际Drive里的文件是大写.PNG、或者后缀是.jpg,甚至id_code漏写了文件后缀,都会被判定为无效文件。 - 文件夹计数包含非图像文件:
os.listdir会统计目录下所有内容,包括Drive自动生成的隐藏文件(比如.DS_Store、Thumbs.db)、缓存文件夹(比如.ipynb_checkpoints)、其他非图像格式文件,这些文件会被你算入3662的总数,但不会被Keras图像生成器识别。
分步排查操作
- 修正路径后重新做全量校验,直接定位所有无效文件,替换原有校验代码为以下内容:
import os import cv2 invalid_records = [] check_dir = train_image_dir # 和生成器使用完全一致的路径,不要硬编码 for file_id in train_data['id_code']: file_path = os.path.join(check_dir, file_id) # 先检查文件是否存在 if not os.path.isfile(file_path): invalid_records.append(("文件不存在/文件名不匹配", file_id)) continue # 读取后判断是否为有效图像,不依赖try-except img = cv2.imread(file_path) if img is None: invalid_records.append(("文件损坏/格式不支持", file_id)) print(f"共检出{len(invalid_records)}个无效文件:") for err_type, filename in invalid_records: print(f"[{err_type}] {filename}")
- 统计目录下实际有效图像数量,排除非图像文件干扰:
valid_image_ext = ('.png', '.jpg', '.jpeg', '.bmp', '.tiff') all_entries = os.listdir(train_image_dir) valid_img_count = 0 invalid_entries = [] for entry in all_entries: full_path = os.path.join(train_image_dir, entry) # 跳过文件夹 if os.path.isdir(full_path): invalid_entries.append(f"文件夹:{entry}") continue # 检查后缀 ext = os.path.splitext(entry)[1].lower() if ext not in valid_image_ext: invalid_entries.append(f"非图像文件:{entry}") continue valid_img_count +=1 print(f"目录内实际有效图像数:{valid_img_count}") print(f"非图像/文件夹类条目共{len(invalid_entries)}个:") for e in invalid_entries: print(e)
- 针对第一步输出的「文件不存在」类记录,直接比对目录内的实际文件名,修正大小写、后缀不匹配的问题即可:
- 如果是
id_code统一漏写后缀,直接批量给列值补全后缀即可,例如所有文件都是png格式的话:train_data['id_code'] = train_data['id_code'].apply(lambda x: x if x.lower().endswith(('.png','.jpg')) else x+'.png') - 如果是大小写不匹配,统一将目录内文件后缀转小写,同时将
id_code列的文件名后缀也统一转小写。
- 如果是
最终修复
排查到无效文件后,要么修正文件名/路径问题,要么直接从train_data dataframe中删除这5条无效文件对应的行,再传入flow_from_dataframe就不会再弹出警告,文件计数也会匹配。
内容的提问来源于stack exchange,提问作者imdatyaa
相关产品推荐
相关产品推荐

