0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用tf.data进行数据集处理

FPGA创新中心 来源:FPGA创新中心 作者:陈远斌 2022-11-29 15:34 次阅读

在进行AI模型训练过程前,需要对数据集进行处理, Tensorflow提供了tf.data数据集处理模块,通过该接口能够轻松实现数据集预处理。tf.data支持对数据集进行大量处理,如图片裁剪、图片打乱、图片分批次处理等操作。

数据集加载介绍

通过tf.data能够实现数据集加载,加载的数据格式包括:

●使用NumPy数组数据
●使用python生成器数据
●使用TFRecords格式数据
●使用文本格式数据
●使用CSV文件格式数据

1tf.data常见数据格式加载示例

●使用Numpy数组数据

通过numpy构建数据,将构建的数据传递到tf.data的Dataset中。

import tensorflow as tf
import numpy as np
# 通过numpy构建数据个数
input_data = np.arange(4)
# 将数据传递到Dataset
dataset = tf.data.Dataset.from_tensor_slices(input_data)
for data in dataset:
    # 打印数据集,转换数据集tensor格式
    print(data)
输出为tensor数据集:
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(3, shape=(), dtype=int64)

●读取文本中数据

通过准备的文本文件file.txt,将文本文件中的内容读取到tf.data,文件内容为:

Tf dataset load numpy data
Tf dataset load txt file data
Tf dateset load CSV file data

加载文本文件代码:

import tensorflow as tf
# 通过TextLineDataset进行加载文本文件内容
dataset = tf.data.TextLineDataset("file.txt")
for line in dataset:
    print(line)

文本加载数据输出(输出的Tensor中已包含了文件文件中的数据):

tf.Tensor(b'Tf dataset load numpy data', shape=(), dtype=string)
tf.Tensor(b'Tf dataset load txt file data', shape=(), dtype=string)
tf.Tensor(b'Tf dateset load CSV file data', shape=(), dtype=string)

●读取csv文本中数据

准备csv文件file.csv,文件内容为:

c03bab18-6cb2-11ed-8abf-dac502259ad0.png  

加载文本文件代码:

  import tensorflow as tf
import pandas as pd
# 使用pandas读取csv文本中数据
data = pd.read_csv('date.csv')
# 将读取的data数据传递到dataset中
f_slices = tf.data.Dataset.from_tensor_slices(dict(data))
for d in f_slices:
    print (d)

csv文本加载数据输出(输出的Tensor中已包含了文件文件中的数据):

{'Year': , 'Month': , 'Day': , 'Hour': }
{'Year': , 'Month': , 'Day': , 'Hour': }
{'Year': , 'Month': , 'Day': , 'Hour': }

●利用python迭代构建数据

通过python构建迭代器方式,将数据传递到tf.data, 示例代码如下:

# 迭代函数,通过传递的stop数据进行迭代
def build_data(stop):
  i = 0
  while i
示例代码输出(迭代5次的Tensor):
tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor(4, shape=(), dtype=int32)

2tf.data常见数据处理

tf.data常用以下操作对数据完成预处理过程,操作包括: repeat、batch、shuffle、map等。

●tf.data数据repeat操作

通过调用repeat操作,将原数据进行重复构建,重复构建根据传递的repeat(x)次数决定。

●tf.data数据batch操作

通过调用batch操作将数据进行分批次执行,每批次数量根据batch(x)的值决定。

●tf.data 数据shuffle操作,打乱数据顺序

shuffle操作常用于预处理数据集时,将数据集中的顺序打乱,shuffle支持配置(buffer_size=x)将数据放置在缓冲区,通过缓冲区方式将数据打乱。

●tf.data 数据map操作

map操作能够将数组中的元素重构,同时能够实现读取图片,对图片进行旋转操作。

示例:

import tensorflow as tf
import numpy as np
# 使用numpy构建12个数据
input_data = np.arange(12)
# 将构建数据传递到dataset,传递中添加shuffle(10个缓冲区数据), batch分批次执行(每次4个数据), repeat重复构建数据2次
dataset = tf.data.Dataset.from_tensor_slices(input_data).shuffle(buffer_size=10).batch(4).repeat(2)
for data in dataset:
    print(data)
示例代码输出(输出中可以看到Tensor每次4个数据,每个数据重复出现2次,每次数据乱序输出):
tf.Tensor([8 3 9 1], shape=(4,), dtype=int64)
tf.Tensor([2 0 4 5], shape=(4,), dtype=int64)
tf.Tensor([ 7 11 10  6], shape=(4,), dtype=int64)
tf.Tensor([6 8 5 4], shape=(4,), dtype=int64)
tf.Tensor([ 7 10  2 11], shape=(4,), dtype=int64)
tf.Tensor([3 1 0 9], shape=(4,), dtype=int64)

图片旋转示例,示例代码如下:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np


(train_data, train_label), (_, _) = tf.keras.datasets.mnist.load_data()
train_data = np.expand_dims(train_data.astype(np.float32) / 255.0, axis=-1)
mnist_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_label))
# 构建旋转函数,通过tensorflow的image.rot90完成90度旋转
def rot90(image, label):
    image = tf.image.rot90(image)
    return image, label
# 通过map方式调用构建的旋转函数
mnist_dataset = mnist_dataset.map(rot90)
for image, label in mnist_dataset.take(1):
    #添加图片抬头标签
    plt.title(label.numpy())
    plt.imshow(image.numpy()[:, :])
    plt.show()

正常加载图片输出:

c069223c-6cb2-11ed-8abf-dac502259ad0.png

示例代码运行后,图片旋转输出:

c07df388-6cb2-11ed-8abf-dac502259ad0.png

mnist数据集预处理

利用TensorFlow Datasets 提供了一系列可以和 TensorFlow 配合使用的数据集。下载和准备数据,以及构建tf.data.Dataset。

示例代码需要:

python3.6版本环境
安装tensorflow==1.14.0版本(pip3 install tensorflow==2.1.0)
安装tensorflow_datasets==4.4.0(pip3 install tensorflow-datasets==4.4.0)
示例代码:
import tensorflow as tf
import tensorflow_datasets as tfds


#数据集通过Tensorflow Eager模式执行
tf.compat.v1.enable_eager_execution()


# 加载 MNIST 训练数据。这个步骤会下载并准备好该数据,除非你显式指定 `download=False` ,值得注意的是,一旦该数据准备好了,后续的  `load`  命令便不会重新下载,可以重复使用准备好的数据。你可以通过指定  `data_dir=`  (默认是  `~/tensorflow_datasets/` ) 来自定义数据保存/加载的路径。
mnist_train = tfds.load(name="mnist", split="train")
assert isinstance(mnist_train, tf.data.Dataset)


mnist_builder = tfds.builder("mnist")
mnist_builder.download_and_prepare()
mnist_train = mnist_builder.as_dataset(split="train")
# 对数据集进行重复使用,并对数据进行打乱,分批次处理
mnist_train = mnist_train.repeat().shuffle(1024).batch(32)
# prefetch 将使输入流水线可以在模型训练时异步获取批处理
mnist_train = mnist_train.prefetch(tf.data.experimental.AUTOTUNE)
info = mnist_builder.info
print(info.features["label"].names)
mnist_test, info = tfds.load("mnist", split="test", with_info=True)
print(info)
# 通过tfds.show_examples可视化数据样本
fig = tfds.show_examples(info, mnist_test)

代码示例输出:

# 数据集label名称
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 数据集信息
tfds.core.DatasetInfo(
    name='mnist',
    full_name='mnist/3.0.1',
    description="""
    The MNIST database of handwritten digits.
    """,
    homepage='http://yann.lecun.com/exdb/mnist/',
    data_path='/home/fabian/tensorflow_datasets/mnist/3.0.1',
    download_size=11.06 MiB,
    dataset_size=21.00 MiB,
    features=FeaturesDict({
        'image': Image(shape=(28, 28, 1), dtype=tf.uint8),
        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10),
    }),
    supervised_keys=('image', 'label'),
    disable_shuffling=False,
    splits={
        'test': ,
        'train': ,
    },
    citation="""@article{lecun2010mnist,
      title={MNIST handwritten digit database},
      author={LeCun, Yann and Cortes, Corinna and Burges, CJ},
      journal={ATT Labs [Online]. Available: http://yann.lecun.com/exdb/mnist},
      volume={2},
      year={2010}
    }""",
)
可视化样本数据图片:

c0ad20ae-6cb2-11ed-8abf-dac502259ad0.png

作者介绍:陈远斌,本科毕业于南开大学,海云捷迅研发工程师,熟悉OpenStack,Kubernetes技术,曾参与社区代码贡献,在OpenStack云计算技术上有一定的开发经验。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    87

    文章

    26307

    浏览量

    263903
  • Data
    +关注

    关注

    0

    文章

    61

    浏览量

    38013
  • python
    +关注

    关注

    51

    文章

    4666

    浏览量

    83433
  • 数据集
    +关注

    关注

    4

    文章

    1176

    浏览量

    24315

原文标题:【技术基础】使用tf.data进行数据集处理

文章出处:【微信号:FPGA创新中心,微信公众号:FPGA创新中心】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DSP怎么在进行数据处理的同时进行串口通信

    DM642的学习版中,怎么在进行数据处理的同时进行串口通信?求大神指导啊纠结了好长时间了
    发表于 02-24 15:42

    HX711如何进行数据处理

    HX711如何进行数据处理
    发表于 11-21 22:03

    arduino可以对OV7670摄像头进行数据采集和处理吗?

    arduino可以对OV7670摄像头进行数据采集和处理吗?
    发表于 08-07 09:23

    TF之CNN:CNN实现mnist数据预测

    TF之CNN:CNN实现mnist数据预测 96%采用placeholder用法+2层C及其max_pool法+隐藏层dropout法+输出层softmax法+目标函数cross_entropy法+
    发表于 12-19 17:02

    Data Set:MLDL常用数据大集合

    Data Set:MLDL常用数据大集合(持续更新)
    发表于 12-19 17:06

    pandas对babynames数据的简单处理

    利用Python进行数据分析——第二章 引言(2):利用pandas对babynames数据进行简单处理
    发表于 08-09 12:58

    STM32 USART串口是如何进行数据处理的呢

    STM32 USART串口接收数据的具体步骤有哪些?STM32 USART串口是如何进行数据处理的呢?
    发表于 11-25 08:56

    DMA进行数据传输和CPU进行数据传输的疑问

    求大佬解答,本人正在学习STM32单片机中DMA直接数据存储部分的内容 看了DMA简介后,也上手过实例代码,但是没有实际的项目经验,所以有以下疑问: DMA外设在进行数据传输的操作,是否也是需要经过
    发表于 05-25 17:18

    keras制作mnist数据的流程

    , ... }step3:load数据以及数据的预处理 import os, glob, json, random importtensorflow as tf importnump
    发表于 08-18 06:38

    Python在音频(Audio)领域中,如何进行数据扩充呢?

    经典的深度学习网络AlexNet使用数据扩充(Data Augmentation)的方式扩大数据集,取得较好的分类效果。在深度学习的图像领域中,通过平移、 翻转、加噪等方法进行数据扩充
    的头像 发表于 04-15 10:35 1w次阅读

    构建简单数据管道,为什么tf.data要比feed_dict更好?

    如果想减少GPU闲置时间,我们可以在管道末尾添加tf.data.Dataset.prefetch(buffer_size),其中buffer_size这个参数表示预抓取的batch数,我们一般设buffer_size=1,但在某些情况下,尤其是处理每个batch耗时不同时
    的头像 发表于 12-03 09:08 4291次阅读

    tf.data API的功能和最佳实践操作

    tf.data API 通过 tf.data.Dataset.prefetch 转换提供了一个软件 pipelining 操作机制,该转换可用于将数据生成的时间与所消耗时间分离。特别是,转换使用后
    的头像 发表于 01-11 13:51 1.3w次阅读

    TensorFlow 2.0将专注于简单性和易用性

    使用 tf.data 加载数据。使用输入管道读取训练数据,用 tf.data 创建的输入线程读取训练数据。使用
    的头像 发表于 01-18 10:44 2422次阅读
    TensorFlow 2.0将专注于简单性和易用性

    如何使用TCGAbiolinks进行数据处理

    :GDCquery()筛选我们需要的数据,TCGAbiolinks包下载TCGA数据进行表达差异分析-肝癌案例 library("TCGAbiolinks") query <- GDCquery
    的头像 发表于 02-15 10:16 5598次阅读

    成功进行数据整合的案例

    预置数十个开箱即用连接器,基于SDK和热插拔的连接器扩展技术,快速启动数据集成,然后利用低代码、自动化数据处理管道方式进行数据建模。
    的头像 发表于 08-19 14:14 639次阅读