今天学习的东西是我的学习盲区了…以前没怎么接触过,不过我会通过老师讲的知识和tf官方文档好好的总结!大家一起学习,知识点的顺序我们就按照老师的ppt来!我们都知道data是数据的意思,tf.data这个模块就是帮助我们快速高效的构建数据输入的一个工具,功能非常强大!
    一:tf.data.Dataset:这个是tf.data的核心,提供了对数据集的高层封装,由一系列的可迭代访问的元素组成,每个元素包含一个或者多个张量。Dataset可以看作是相同类型"元素"的有序列表。
    创建数据集,tf.data.Dataset常用的方法如下:
1.tf.data.Dataset.from_tensor():创建Dataset对象合并输入并返回具有单个元素的数据集,输入对象可以是一个或者多个张量,但是from_tensor会将所有的输入压缩为一个元素

import tensorflow as tf
a = tf.fill([2,3],9)
b = tf.fill([2,3],9)
print(tf.data.Dataset.from_tensors(a))
#注意传入多个数据时候要用列表或者字典的形式,否则会报错
print(tf.data.Dataset.from_tensors([a,b]))

out:<TensorDataset shapes: (2, 3), types: tf.int32>
	<TensorDataset shapes: (2, 2, 3), types: tf.int32>

2.tf.data.Dataset.from_tensor_slices(tensors):tensors: 输入可以是一个或者多个 tensor,若是多个 tensor,需要以元组的形式组装起来;另外所有的输入对象,在 “axis = 0” 即第一个维度上,必须有相同的 “shape”。
Dataset 内部元素的状态:生成 Dataset 时, 首先会扫描所有输入,然后在第一个维度上进行切片,返回的 Dataset 中的每个元素取决于输入对象,即输入对象在第一个维度上进行粒度为1的切片,切片后的每个元素就是返回的Dataset 中每个元素的内容。若输入有多个对象, 则在每个对象的第一个维度切片后的信息以元组的形式组合起来, 称为 Dataset 中的元素。

!!这里要将两个方法结合起来看,一个是拆分,一个是压缩!!都是从第一个维度上边

a = tf.ones([5,6])
b = tf.zeros([5,6])
c = tf.data.Dataset.from_tensor_slices(a)

for i in c:
    print(i)
    print(i.shape)
"""
out:
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)
(6,)
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)
(6,)
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)
(6,)
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)
(6,)
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)
(6,)
"""
d = tf.data.Dataset.from_tensor_slices([a,b])
for i in d:
    print(i)
    print(i.shape)
"""
这里的d将a和b拼接在了一起,所以遍历的时候每个元素的shape是(5,6)

tf.Tensor(
[[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]], shape=(5, 6), dtype=float32)
(5, 6)
tf.Tensor(
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]], shape=(5, 6), dtype=float32)
(5, 6)
"""

3.tf.data.Dataset.from_generator(generator, output_types, output_shapes, args):
generator : 自定义的生成器对象,用于生成构建 Dataset 所需的元素。
output_shapes 和 output_types : 指生成器生成的元素的形状与格式
args : 调用自定义生成器所需的参数,需要以元组的形式组装起来
不同于 from_tensors()、from_tensor_slices(),这两种方式是一次性读取生成 Dataset 所需的全部元素, 而 from_generator() 则是一次生成一个所需的元素,当数据量非常大时,应该采用第二种方式。

#这个方法是处理大数据集的,后边我们用到了在来讲解

    tf.data.Dataset提供了许多数据集预处理方法,最常用的如下:

1 .map
map接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Dataset,如我们可以对dataset中每个元素的值加1:

dataset = tf.data.Dataset.from_tensor_slices(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
dataset = dataset.map(lambda x: x + 1) 
# 2.0, 3.0, 4.0, 5.0, 6.0

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

dataset = dataset.batch(64)

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

dataset = dataset.shuffle(buffer_size=10000)

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

dataset = dataset.repeat(5)