1. tf.data API 在 TensorFlow 中引入了两个新概念:
1.1**tf.data.Dataset:**
表示一系列元素,其中每个元素包含一个或多个 Tensor 对象。例如,在图片管道中,一个元素可能是单个训练样本,具有一对表示图片数据和标签的张量。可以通过两种不同的方式来创建数据集。
操作方法:
直接从 Tensor 创建 Dataset
Dataset.from_tensor_slices()
通过对数据集压缩在一起创建一个“数据集”来建立
Dataset.zip()
从一个或多个tf.data.Dataset对象中构建dataset
Dataset.batch()
1.2 **tf.data.Iterator:**
此方式主要用于从数据集中提取元素。Iterator.get_next() 指令会在执行时生成 Dataset 的下一个元素,可充当输入管道和模型之间的接口。通过 Iterator.initializer
指令使用不同的数据集初始化和参数化迭代器,可在同一个程序中对训练和验证数据进行多次迭代
操作方法:
迭代器对象实例化(非Eager模式下):
iterator = dataset.make_one_shot_iterator()
one_element = iterator.get_next()
2. 数据集处理方法
Dataset支持一类特殊的操作:Transformation。一个Dataset通过Transformation变成一个新的Dataset。通常我们可以通过Transformation完成数据变换,打乱,组成batch,生成epoch等一系列操作。
常用的Transformation有:
-
map: 和python中的map类似,map接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Dataset
-
shuffle: shuffle的功能为打乱dataset中的元素,它有一个参数buffersize,表示打乱时使用的buffer的大小,一般设为10000
dataset=dataset.shuffle(7) #让数据乱序7次
- repeat: repeat的功能就是将整个序列重复多次,主要用来处理机器学习中的epoch,假设原先的数据是一个epoch,使用repeat(3)就可以将之变成3个epoch
dataset=dataset.repeat(count=3) #让数据循环3次
- batch: batch就是将多个元素组合成batch
dataset=dataset.batch(4) #一次喂4个数
实例演示:
dataset=tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7])
dataset=dataset.shuffle(7)
dataset=dataset.repeat(count=3)
dataset=dataset.batch(4)
for i in dataset:
print(i.numpy())
out:
[1,3,5,2]
[7,2,5,4]
[2,2,5,1]
.
.
.
一次出来4个数,循环3次
3. Dataset创建实例
3.1 创建一个一维Dataset
dataset=tf.data.Dataset.from_tensor_slices([1,2,3,4,5])
for i in dataset
print(i.numpy())
out:
1
2
3
4
5
3.2 创建一个二维Dataset
dataset=tf.data.Dataset.from_tensor_slices([[1,2],[3,4],[5,6]])
for i in dataset:
print(i.numpy())
out:
[1,2]
[3,4]
[5,6]
3.3 以字典形式创建Dataset
dataset=tf.data.Dataset.from_tensor_slices({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
for i in dataset:
print(i.numpy())
out:
[1,2,3,4],‘b’:[5,6,7,8],‘c’=[9,10,11,12]})
3.4 将Dataset里的数据平方
dataset=tf.data.Dataset.from_tensor_slices(np.array([1,2]))
dataset=dataset.map(tf.square) #平方所有数据
for i in dataset:
print(i.numpy())
out:
1
4
4. tf.data.dataset使用实例
目的:创建一个手写MNIST数据集
自动下载数据集
(train_images,train_labels),(test_images,tset_labels)=tf.keras.dataset.mnist.load_data()
创建训练图片数据集
ds_train_img=tf.data.Dataset.from_tensor_slices(train_images)
创建训练标签数据集
ds_train_lab=tf.data.Dataset.from_tensor_slices(train_labels)
合并两个数据集称为元组形式
ds_train=tf.data.Dataset.zip(ds_train_img,ds_train_lab)
乱序10000次,循环,每次喂64张图
ds_train=ds_train.shuffle(10000).repeat().batch(64)
求得每个epoch迭代的数量
steps_per_epochs=train_images.shape[0]//64
创建测试数据集
ds_test=tf.data.Dataset.from_tensor_slices(test_images,tset_labels)