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

能否不使用tfrecords直接读取图像标签进行TensorFlow模型训练?

无需生成TFRecords的TensorFlow大规模数据集训练方案

完全可以跳过TFRecords制作流程,直接基于原始图像和对应标签开展训练。TFRecords只是TensorFlow官方推荐的高性能存储格式,并非模型训练的强制前置要求,以下是两种常用的实现方案:

方案1:按目录存储的分类数据集直接加载

如果你的数据集已经按「类别为文件夹名,对应类别的图像放在对应文件夹内」的结构整理,可以直接调用tf.keras.utils.image_dataset_from_directory接口加载,接口自带懒加载逻辑,不会一次性将全部数据读入内存:

import tensorflow as tf

# 加载训练集
train_ds = tf.keras.utils.image_dataset_from_directory(
    "./train_dataset_dir", # 替换为你的训练集根目录路径
    image_size=(224, 224), # 统一输出的图像尺寸
    batch_size=32, # 批次大小可根据显存调整
    label_mode="categorical" # 二分类任务可设为binary,回归任务可设为None
)
# 开启预取优化,避免GPU等待IO
train_ds = train_ds.prefetch(tf.data.AUTOTUNE)

# 后续直接传入model.fit即可训练
# model.fit(train_ds, epochs=10)

方案2:自定义数据加载流水线

如果你的图像路径和对应标签存储在CSV、列表等其他结构中,可以通过tf.data.Dataset自定义加载流程,同样支持流式加载不占满内存:

import tensorflow as tf

# 示例:提前准备好所有图像路径列表和对应标签列表
image_path_list = ["./a.jpg", "./b.jpg", "./c.jpg"]
label_list = [0, 1, 0]

# 单样本加载与预处理逻辑
def preprocess_fn(img_path, label):
    # 读取图像
    img = tf.io.read_file(img_path)
    img = tf.image.decode_jpeg(img, channels=3)
    # 统一尺寸+归一化
    img = tf.image.resize(img, [224, 224])
    img = tf.cast(img, tf.float32) / 255.0
    return img, label

# 构建数据集流水线
dataset = tf.data.Dataset.from_tensor_slices((image_path_list, label_list))
# 并行执行预处理
dataset = dataset.map(preprocess_fn, num_parallel_calls=tf.data.AUTOTUNE)
# 打乱:缓冲区大小根据内存调整,不需要等于总样本数
dataset = dataset.shuffle(buffer_size=2000)
# 分批+预取
dataset = dataset.batch(32).prefetch(tf.data.AUTOTUNE)

性能优化注意事项

  • 不需要将shuffle的buffer_size设置为总样本量,1000~10000的区间即可平衡打乱效果和内存占用
  • 数据增强操作直接放在preprocess_fn中调用TensorFlow原生算子实现,可在图模式下并行执行,训练速度和使用TFRecords基本无明显差异
  • 如果数据集大小超过单块硬盘的读取速度上限,可将数据拆分存储到多块硬盘,搭配tf.data.Dataset.interleave接口并行读取进一步提升加载速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:04