Tensorflow2.0 自定义图像数据集 读取加速 tf.data.Dataset.cache (二)

本文对比了Tensorflow2.0中使用.pipeline(), .cache()以及创建缓存文件三种方式在处理自定义图像数据集时的性能。实验结果显示,.cache()和缓存文件能显著提高数据读取速度,特别是多次迭代时,效率提升明显。" 104792896,5711944,MAC环境下使用keytool解析APK签名信息,"['Android开发', '签名验证', '命令行工具', 'keytool']

接上一篇Tensorflow2.0 tf.data.Dataset.from_tensor_slices 自定义图像数据集 (一)。这里对比pipeline、cache(缓存)和.cache(filename=’./cache.tf-data’)方法建立缓存文件

Tensorflow

pipeline性能

在建立tf.data.Dataset.from_tensor_slicestf.data.Dataset.from_tensor_slices对象后,建立一个时间函数来记录数据读取的时间

steps_per_epoch=100
import time
default_timeit_steps = 2*steps_per_epoch+1

def timeit(ds, steps=default_timeit_steps):
    overall_start = time.time()
    # 在开始计时之前
    # 取得单个 batch 来填充 pipeline(管道)(填充随机缓冲区)
    it = iter(ds.take(steps+1))
    next(it)

    start = time.time()
    for i
### 创建数据集的不同方式及示例 在 TensorFlow.NET Keras 中,`tf.data` 提供了多种方式来创建数据集,支持从内存数据、文件数据、文本行等多种来源构建数据集。以下是一些常见的创建方式及其示例。 #### 从内存数据创建数据集 `Dataset.FromTensorSlices` 是一种常见方法,用于将内存中的 NumPy 数组或张量转换为 `tf.data.Dataset` 对象。这种方式适用于数据集较小、可以直接加载到内存中的情况。 ```csharp // 假设 features 和 labels 是 NumPy 数组 var dataset = Dataset.FromTensorSlices((features, labels)); ``` 此方法将输入数据按第一个维度进行切片,并生成一个数据集,每个元素是一个样本和对应的标签[^2]。 #### 从文件创建数据集数据集较大时,通常会将其存储在磁盘上,并通过 `tf.data` 读取。例如,可以使用 `TextLineFromFile` 方法从文本文件中逐行读取数据。 ```csharp var dataset = Dataset.TextLineFromFile("data.txt"); ``` 此方法适用于处理文本文件中的原始数据,如 CSV 文件或纯文本数据。也可以结合 `map` 操作对每行数据进行解析和处理[^1]。 #### 从 TFRecord 文件创建数据集 TFRecord 是 TensorFlow 推荐的数据存储格式,适用于大规模数据集的高效读取。可以通过 `TFRecordDataset` 从 TFRecord 文件中读取数据。 ```csharp var dataset = new TFRecordDataset("data.tfrecord"); ``` 通常需要结合 `ParseSingleExample` 或 `ParseExample` 函数对每个样本进行解析,以提取特征和标签[^1]。 #### 从生成器创建数据集 如果数据集无法一次性加载到内存中,或者需要动态生成数据,可以使用 `Dataset.FromGenerator` 方法。该方法允许定义一个生成器函数,按需生成数据。 ```csharp IEnumerable<int> Generator() { for (int i = 0; i < 100; i++) yield return i; } var dataset = Dataset.FromGenerator(Generator, OutputType<int>()); ``` 此方法适用于需要按需生成数据的场景,例如数据增强或模拟数据生成[^1]。 #### 从多个文件创建数据集 当数据分布在多个文件中时,可以使用 `Dataset.ListFiles` 和 `Dataset.Interleave` 方法并行读取多个文件。 ```csharp var fileDataset = Dataset.ListFiles("data/*.tfrecord"); var dataset = fileDataset.Interleave( file => new TFRecordDataset(file), numParallelCalls: 4 ); ``` 此方法可以提高大规模数据集读取效率,尤其是在分布式训练环境中[^1]。 #### 与 Keras 模型集成 `tf.data.Dataset` 可以直接作为输入提供给 Keras 模型的 `fit` 和 `evaluate` 方法。数据集应返回 `(inputs, targets)` 或 `(inputs, targets, sample_weights)` 的元组。 ```csharp model.Fit(dataset, epochs: 10); ``` 这种方式简化了训练流程,避免了手动管理批次和标签的复杂性[^3]。 --- ### 示例:构建完整数据管道 以下是一个完整的数据处理流水线示例,包括数据打乱、映射、批处理和预取操作。 ```csharp var dataset = Dataset.FromTensorSlices((features, labels)) .Shuffle(bufferSize: 1000) .Map(x => Preprocess(x), numParallelCalls: 4) .Batch(32) .Repeat(count: 10) .Prefetch(bufferSize: 1); ``` 此流水线确保数据在训练过程中被打乱、分批,并且在训练时可以高效地预取下一批数据,减少等待时间。 --- ### 相关问题 1. 如何在 TensorFlow.NET 中使用 `tf.data` 进行图像数据增强? 2. `tf.data` 中的 `prefetch` 和 `cache` 有什么区别? 3. 如何在 TensorFlow.NET 中使用 `tf.data` 加载 TFRecord 文件? 4. `tf.data` 的 `shuffle` 操作对模型训练有什么影响? 5. 如何在 TensorFlow.NET 中使用 `tf.data` 实现自定义数据预处理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值