tf.data

一、tf.data简介

从读取数据到数据传入加速设备(GPU或TPU)的流程被称为输入管道(Input Pipeline)。TensorFlow提供tf.data API,可以帮助使用者打造灵活有效的输入管道,轻松处理大量数据、不同数据格式及复杂的转换。

输入管道可以分为以下3个步骤:
1、提取(Extraction)

从存储的地方(可以是SSD、HDD或远程存储位置)读取数据。

2、转换(Transformation)

使用CPU进行数据预处理,例如对图像进行翻转、裁剪、缩放和正则化等。

3、载入(Loading)

将转换后的数据加载到机器学习模型的加速设备。

上面这3个步骤主要是设备读取数据和CPU预处理在消耗时间,如果没有妥善地分工处理,就会造成当CPU在准备数据时,GPU在等待训练数据的产生(GPU处于空闲状态);反之,当GPU在训练时,CPU则处于空闲状态,如图2-16所示。如此,训练时间就会增加很多。

TensorFlow提供tf.data API,通过使用tf.data.Dataset.prefetch,行指令就可以让生成数据与训练数据同时进行,进而提升训练效率,如图2-17所示。

倘若输入管道的执行时间远比训练时间久,将发生如图2-18所示的情况,造成GPU或TPU加速器无法发挥全部的运算力,通常这种情况可能是读取文件太大或数据预处理太久造成的。

上述问题可以使用CPU多线程来解决,只需在调用map方法时加入 num parallel_calls 设置,即可启用并行处理数据的功能。通常num parallel_calls 会设置成计算机的核心数,图2-19所示为改善后的工作情况。

 二、基本操作

import tensorflow as tf
import os

def _parse_function(filename, label):
    image_string = tf.compat.v1.read_file(filename)
    # 将图像使用JPEG的格式解码从而得到图像对应的三维矩阵。
    image_decoded = tf.image.decode_jpeg(image_string,channels=3)
    # 通过tf.image.resize_images函数调整图像的大小。
    image_resized = tf.compat.v1.image.resize_images(image_decoded, [224, 224])
    return image_resized, label

file_path = r'E:\修图作品\2022-6-16'
data = [os.path.join(file_path,i) for i in os.listdir(file_path)]
label = [0]*len(data)

dataset = tf.data.Dataset.from_tensor_slices((data,label))
dataset = dataset.map(_parse_function) #map对数据集应用自定义函数
dataset = dataset.batch(40) #设置每一批读取的数据量
dataset = dataset.repeat(2) #设置可以重复读取dataset n次

iterator = iter(dataset)
while 1:
    try:
        image, _ = next(iterator)
        print(image.shape)
    except StopIteration:   # python内置的迭代器越界错误类型
        print("iterator done")
        break;
'''
len(data) = 93
40+40+13=93
'''

 

<think>嗯,用户遇到了一个TensorFlow的警告信息,需要解释清楚这个问题。首先,我得仔细看看警告的内容。警告说虽然设置了`tf.config.experimental_run_functions_eagerly`,但这个选项对tf.data的函数不适用,建议使用`tf.data.experimental.enable_debug_mode()`。 那用户可能是在调试的时候启用了立即执行模式,但发现对数据管道没用。我需要先解释这两个API的作用。`experimental_run_functions_eagerly`是让TensorFlow的函数以即时执行模式运行,方便调试,但tf.data部分可能还是用图模式执行,导致问题。 接下来,要说明为什么会出现这个警告。可能是因为用户已经设置了`experimental_run_functions_eagerly`,但处理数据集的时候还是用图模式,所以需要另一个方法。这里的关键是区分普通函数和tf.data函数的不同处理方式。 然后,解决方案部分需要分步骤。第一步是替换原来的设置,使用`enable_debug_mode()`,并说明如何调用。第二步可能需要提到在TF 2.3及以上版本才有效,如果版本低的话需要升级。另外,要提醒这个调试模式可能影响性能,所以只应在调试时使用。 还要考虑用户可能的其他情况,比如是否需要修改数据管道代码,或者是否有替代方案。比如,如果不想用调试模式,可以用`tf.data.Dataset.from_generator`或者用Python循环迭代数据集,但这些都是备选方案,可能不如官方推荐的方法好。 最后,确保回答结构清晰,分点说明问题原因和解决方法,并给出示例代码。可能需要检查TensorFlow的版本,或者提醒用户注意性能影响。总之,要逐步引导用户解决问题,确保他们理解每个步骤的作用。</think>这个警告信息与TensorFlow的调试模式设置相关,下面我会分步骤解释问题原因及解决方法: 1. **问题背景**: - `tf.config.experimental_run_functions_eagerly(True)` 是用于强制TensorFlow以即时执行模式(Eager Execution)运行函数,通常用于调试或兼容旧代码。 - 但此设置对 `tf.data` API(用于构建高效数据管道的模块)不生效,因为`tf.data`的内部实现仍可能使用图执行模式。 2. **警告含义**: - 当你想调试`tf.data`相关代码(如`Dataset.map()`、`Dataset.batch()`等操作)时,仅设置`experimental_run_functions_eagerly`无法捕获`tf.data`流水线中的错误。 - `tf.data`需要单独启用调试模式才能以即时执行模式运行。 3. **解决方案**: ```python # 替换原有设置 tf.config.experimental_run_functions_eagerly(True) # 可选,针对非tf.data代码 tf.data.experimental.enable_debug_mode() # 必须,针对tf.data代码 ``` 4. **注意事项**: - 调试模式会显著降低`tf.data`性能,仅应在调试时使用。 - TensorFlow 2.3+ 版本支持该功能,旧版本需升级。 - 调试完成后应禁用: ```python tf.data.experimental.disable_debug_mode() ``` 5. **替代方案**: 如果无法使用调试模式,可通过以下方式调试数据管道: ```python # 强制转换为Python迭代器 dataset = dataset.as_numpy_iterator() for batch in dataset: print(batch) ``` 或使用: ```python tf.data.Dataset.from_generator() # 构建基于Python生成器的数据集 ``` 此警告提示开发者需要区分对待普通函数执行和`tf.data`管道的调试模式设置,两者在TensorFlow中属于不同的执行上下文。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值