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

如何将单目录下带CSV标签的图像数据集加载至TensorFlow?

单目录+CSV标签的图像数据集加载方案(TensorFlow)

因为tf.keras.utils.image_dataset_from_directory依赖按类别分文件夹的目录结构,而你的数据是单目录存储图像、CSV记录标签的形式,推荐用tf.data.Dataset自定义加载流程,灵活性更高。

具体实现步骤

1. 读取并预处理CSV标签

先把CSV中的文件名和文本标签转换成模型可识别的格式:

import pandas as pd
import tensorflow as tf

# 读取CSV文件
df = pd.read_csv('labels.csv')
# 将文本标签映射为数值(cat=0,dog=1)
label_mapping = {'cat': 0, 'dog': 1}
df['label'] = df['label'].map(label_mapping)

# 提取文件名和标签数组
filenames = df['filename'].values
labels = df['label'].values

2. 构建图像加载流水线

编写函数完成图像路径拼接、读取、解码与预处理,再通过tf.data.Dataset映射到数据集中:

def load_preprocess_img(filename, label):
    # 拼接图像完整路径(假设图像都在data目录下)
    img_full_path = tf.strings.join(['data/', filename])
    # 读取图像文件
    raw_img = tf.io.read_file(img_full_path)
    # 解码图像(如果是JPG格式,替换为tf.image.decode_jpeg)
    decoded_img = tf.image.decode_png(raw_img, channels=3)
    # 调整图像尺寸(根据你的模型需求修改,比如224x224)
    resized_img = tf.image.resize(decoded_img, [224, 224])
    # 归一化像素值到[0, 1]区间
    normalized_img = tf.cast(resized_img, tf.float32) / 255.0
    return normalized_img, label

# 从文件名和标签构建基础数据集
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
# 映射加载预处理函数,开启多线程加速
dataset = dataset.map(load_preprocess_img, num_parallel_calls=tf.data.AUTOTUNE)

3. 优化数据集性能

添加打乱、分批、预取操作,提升训练时的效率:

# 打乱数据集(buffer_size建议设为样本总数,内存不足时可适当缩小)
dataset = dataset.shuffle(buffer_size=len(filenames))
# 设置批次大小
batch_size = 32
dataset = dataset.batch(batch_size)
# 预取数据,让GPU训练与CPU数据准备并行
dataset = dataset.prefetch(tf.data.AUTOTUNE)

4. 验证加载结果(可选)

快速检查数据集是否正常:

# 取出第一个批次的图像和标签
for batch_imgs, batch_lbls in dataset.take(1):
    print(f"单批次图像形状: {batch_imgs.shape}")
    print(f"单批次标签形状: {batch_lbls.shape}")
    print(f"第一个图像的标签: {batch_lbls[0].numpy()}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:45:35