You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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图像生成器识别。

分步排查操作

  1. 修正路径后重新做全量校验,直接定位所有无效文件,替换原有校验代码为以下内容:
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}")
  1. 统计目录下实际有效图像数量,排除非图像文件干扰:
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)
  1. 针对第一步输出的「文件不存在」类记录,直接比对目录内的实际文件名,修正大小写、后缀不匹配的问题即可:
    • 如果是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:06:26