为何tf.keras.preprocessing.image_dataset_from_directory未读取目录全部PNG图像
接口未扫描全部图像的核心原因
tf.keras.preprocessing.image_dataset_from_directory有固定的目录扫描规则,和你当前的目录结构完全不匹配:
- 该接口设计上面向分类任务,要求传入的根路径下必须存在至少一个一级子目录:它会把所有一级子目录识别为分类的类别,仅扫描这些子目录内部的图像文件,不会扫描根路径下的零散散文件。
- 你将12140张PNG直接存放在PATH根目录、没有任何一级子目录存放的情况下,接口的枚举逻辑出现了异常:它错误地将PATH下的零散系统文件、隐藏文件或极小的隐藏子目录内的文件识别为有效图像,最终仅统计到37个文件。你看到的“30个训练样本”,是接口基于这错误统计到的37个文件做的
validation_split分割结果,和你实际的12140张图像无关联。 - 次要可能原因:若你使用Linux/macOS系统,接口默认对扩展名大小写敏感,部分后缀为大写
.PNG的文件会被直接跳过。但你的glob已经统计到12140个小写后缀的PNG,该场景发生率较低。
适配自编码器训练场景的解决办法
你不需要标签来训练卷积自编码器,有两种可直接落地的方案:
- 方案1:适配接口设计要求:在PATH下新建一个空子目录(例如命名为
unsupervised),将所有12140张PNG移动到该子目录内。此时接口会自动将unsupervised识别为唯一类别,即可扫描到全部图像。 - 方案2:使用原生无标签加载逻辑:直接绕过这个面向分类任务的接口,用
tf.data.Dataset.list_files匹配PATH下所有PNG路径,再自行编写图像加载、归一化的预处理逻辑,更适配自编码器的无标签训练需求。
内容的提问来源于stack exchange,提问作者Soerendip
相关产品推荐
相关产品推荐

