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

image_dataset_from_directory多标签分类标签赋值异常咨询

问题成因

tf.keras.utils.image_dataset_from_directory() 原生仅支持单标签多分类任务的数据加载,没有内置多标签场景的适配逻辑,你当前的用法不符合函数的设计预期。
你观察到的标签轮转现象,本质来自函数的文件遍历和打标逻辑:

  • 函数不会做跨目录的文件去重,也不会识别不同目录下文件名相同、内容相同的图片为同一样本。它会递归扫描所有类别子目录下的全部文件,每个独立文件路径对应一个独立样本,标签直接取该文件所在子目录对应的类别序号,转成one-hot向量。
  • 你的测试目录下实际存在96*3=288个独立图片文件:class_a目录下的96张图全部被标记为[1,0,0],class_b目录下的96张全部标记为[0,1,0],class_c目录下的96张全部标记为[0,0,1]。
  • 函数默认开启文件顺序打乱(shuffle=True),因此你取批次查看时会看到三个标签交替出现。如果传入参数shuffle=False关闭打乱,你会看到输出先连续跑完class_a下所有带[1,0,0]标签的样本,再连续跑class_b、class_c的样本,不存在你猜测的「首次/末次匹配覆盖标签」逻辑。

你设计的「同图复制到多类目录」的存储方式,不会被函数识别为多标签样本,只会生成3倍冗余的单标签样本,完全无法得到你预期的多标签输出。

可行实现方案
  • 优先采用自定义tf.data流水线方案(性能最优、适配性最强)
    1. 放弃同图多份复制的存储逻辑,所有图片仅存1份,单独维护标签映射:可以用你已经掌握的csv、txt、xml解析方式,或者从文件名解码的方式,为每张图片生成对应的多标签one-hot向量,整理为「图片路径列表」+「对应多标签张量列表」的形式。
    2. 编写图片预处理函数,实现文件读取、解码、尺寸调整、像素归一化等操作,示例逻辑如下:
    def load_and_preprocess(path, label):
        img = tf.io.read_file(path)
        img = tf.image.decode_jpeg(img, channels=3)
        img = tf.image.resize(img, [img_height, img_width])
        img = img / 255.0
        return img, label
    
    1. 调用tf.data.Dataset.from_tensor_slices((path_list, label_list))构建基础数据集,再依次调用.map(load_and_preprocess)、.shuffle()、.batch()、.prefetch()完成训练流水线搭建即可。
  • 临时测试兼容方案(不推荐生产环境使用)
    如果你暂时不想调整现有目录结构,可以按以下步骤处理:
    1. 调用image_dataset_from_directory时传入shuffle=False,遍历数据集拿到所有288个样本的文件名、像素矩阵、单标签。
    2. 以文件名为key做分组,对同文件名对应的多个单标签向量做按位或运算,合并为多标签向量,同时去重保留唯一的图片像素数据。
    3. 将去重合并后的(像素矩阵,多标签向量)对重新组装为tf.data.Dataset对象即可。

    该方案存在3倍文件冗余,额外的去重合并步骤会增加IO和计算开销,仅适合快速验证场景。

内容的提问来源于stack exchange,提问作者ghylander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:42:22