Tensorflow关于Dataset的一般操作

Dataset封装了很好的关于数据集的一些基本操作,在这里做一下总结。该对象的路径是:tensorflow.data.Dataset(这是1.4版本之后的)很大程度上参考了这篇博客

同时再推荐一个特别好的博客:https://towardsdatascience.com/how-to-use-dataset-in-tensorflow-c758ef9e4428

Tensoflow的核心数据就是tensor。可以这么理解,想要让tensoflow的数据正确的“流动”起来,那么就需要正确的匹配张量的维数。再给计算图模型填充数据的时候,使用字典的方式是最慢的,应该避免这种操作;正确的做法是把数据组合成张量,进行操作,这也是tf.data.Dataset的核心功能之一。

tf.data.Dataset.from_tensor_slices

该函数是核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外层的数据切出。。直接看代码理解。

假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple,那么我们的想法是让每个标签都恰好对应2个特征,而且像直接切片,比如:[f11, f12] [t1]f11表示第一个数据的第一个特征,f12表示第1个数据的第二个特征,t1表示第一个数据标签。那么tf.data.Dataset.from_tensor_slices就是做了这件事情:

import tensorflow as tf
import numpy as np

features, labels = (np.random.sample((5, 2)),  # 模拟5组数据,每组数据2个标签
                    np.random.sample((5, 1)))  # 模拟5组特征,注意两者的维数必须匹配

print((features, labels))  #  输出下组合的数据
data = tf.data.Dataset.from_tensor_slices((features, labels))
print(data)  # 输出张量的信息

结果输出:

(array([[0.94509483, 0.19160528],
       [0.49125608, 0.93146317],
       [0.19331899, 0.59950161],
       [0.8338232 , 0.71606446],
       [0.23264883, 0.71179252]]), array([[0.48340206],
       [0.55842171],
       [0.30450086],
       [0.45078316],
       [0.40497981]]))
<DatasetV1Adapter shapes: ((2,), (1,)), types: (tf.float64, tf.float64)>

tf.data.Dataset.make_one_shot_iterator

生成一个迭代器,用于便利所有的数据。一般用法如下:

tf.data.Dataset.make_one_shot_iterator.get_next()

每次列举出下一个数据集。
实例:

import tensorflow as tf
import numpy as np

data = tf.data.Dataset.from_tensor_slices(
    np.array([1, 2, 3, 4, 5]))

element = data.make_one_shot_iterator().get_next()  # 建立迭代器,并进行迭代操作

with tf.Session() as sess:
    try:
        while True:
            print(sess.run(element))
    except tf.errors.OutOfRangeError:
        print("Out range !")

以字典的方式处理数据

import tensorflow as tf
import numpy as np

a = np.array(['a', 'b', 'c', 'd', 'e'])
b = np.array([1, 2, 3, 4, 5])

# 分别切分数据,以字典的形式存储
data = tf.data.Dataset.from_tensor_slices(
    {
        "label1": a,
        "label2": b
    }
)

it=data.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    try:
        while True:
            print(sess.run(it))
    except tf.errors.OutOfRangeError:
        print("out of range")

输出结果

{'label2': 1, 'label1': b'a'}
{'label2': 2, 'label1': b'b'}
{'label2': 3, 'label1': b'c'}
{'label2': 4, 'label1': b'd'}
{'label2': 5, 'label1': b'e'}

常用的数据集操作

map函数

与python中的map作用类似,对输入的数据进行预处理操作。

import tensorflow as tf
import numpy as np

a = np.array([1, 2, 3, 4, 5])

data = tf.data.Dataset.from_tensor_slices(a)
# 注意在这里是返回的集合,原来的集合不变
data = data.map(lambda x: x ** 2)

it = data.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    try:
        while True:
            print(sess.run(it))
    except tf.errors.OutOfRangeError:
        print("out of range")
batch函数

batch就是将多个元素组合成batch,如下面的程序将dataset中的每个元素组成了大小为32的batch:

dataset = dataset.batch(32)
shuffle函数

shuffle的功能为打乱dataset中的元素,它有一个参数buffersize,表示打乱时使用的buffer的大小:

dataset = dataset.shuffle(buffer_size=10000)
repeat函数

repeat的功能就是将整个序列重复多次,主要用来处理机器学习中的epoch,假设原先的数据是一个epoch,使用repeat(5)就可以将之变成5个epoch:

dataset = dataset.repeat(5)  # 重复5次数据

注意,必须指明重复的次数,否则会无限期的重复下去。

一种常规的用法:
dataset.shuffle(1000).repeat(10).batch(32)

把数据进行1000个为单位的乱序,重复10次,生成批次为32的batch

tf.data.TextLineDataset

这个函数的输入是一个文件的列表,输出是一个dataset。dataset中的每一个元素就对应了文件中的一行。可以使用这个函数来读入CSV文件。一般操作方式:

tf.data.TextLineDataset(file_path).skip(n)

读取文件,同时跳过前n行。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: TensorFlow Dataset(TFDS)是一个用于构建高效、可重复使用的数据管道的库。它提供了一些预先处理好的数据集,同时也支持用户自己导入自定义数据集,并可以在数据集上应用各种转换操作,例如 shuffle、batch、map、filter 等等。使用 TensorFlow Dataset 可以帮助用户更加方便地处理数据,并提高数据处理的效率。 ### 回答2: TensorFlow Dataset是一种高性能、易用、可重复的数据输入管道工具,用于处理大规模的训练和验证数据集。TensorFlow Dataset支持多种类型的数据源,如TensorFlow中的张量、numpy数组、Python生成器、CSV文件等等,并提供了一系列数据变换操作,例如shuffle、batch、map和repeat等等,有效地减少数据预处理的代码量。TensorFlow Dataset还支持多线程和预取数据操作,可以大幅度提高数据输入的效率。 使用TensorFlow Dataset有以下优点: 1.性能高:TensorFlow Dataset很好地利用了硬件资源,提供了高效的数据输入管道,极大地提高了训练效率。 2.处理数据方便:TensorFlow Dataset提供了一系列数据变换操作,方便地处理数据。 3.易用:TensorFlow Dataset简单易懂,并且有很多示例可以参考。 4.可复制:TensorFlow Dataset的数据输入是可重复的,保证了实验结果的可复现性。 在使用TensorFlow Dataset时,需要先将数据转换成tf.data.Dataset类型,然后使用map、batch、shuffle等方法进行数据处理,最后以迭代器的形式读取数据进行训练。TensorFlow Dataset的优点在于提供了一种易于使用,高效灵活的数据处理工具,可以大幅度降低数据预处理的代码量,同时保证训练效率和实验结果的可复现性,适用于大规模深度学习训练及推理。 ### 回答3: TensorFlow Dataset是Google开发的一种灵活、高效的数据载入工具,它是TensorFlow官方推荐的载入数据的方法之一。使用TensorFlow Dataset可以实现对大型数据集进行高效、快速的处理,同时也可以方便地进行数据预处理和输入函数的编写。 TensorFlow Dataset支持多种数据源,如numpy数组、csv文件、TFRecord文件、文本文件等。同时,它也支持对数据进行变换、扩充、重复、分片等操作,方便进行数据预处理。在数据输入时,TensorFlow Dataset可以自动进行多线程读取,提高数据输入的效率。 TensorFlow Dataset同时也支持多种数据集的处理操作,如shuffle、batch、repeat、map等。这些操作可以方便地实现数据集的乱序、分批、数据增强等操作。同时,TensorFlow Dataset还提供了一种方便的函数tf.data.Iterator,可以方便地实现对数据集的遍历。 TensorFlow Dataset的使用可以提高训练效率、降低内存消耗、方便数据预处理等,因此在TensorFlow的开发中得到广泛的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值