tf.data.Dataset
tf.data中包含了两个用于TensorFLow程序的接口:Dataset和Iterator
我们今天主要来看tf.data.Dataset
一 概念
首先Dataset表示一个元素的集合,你可以把它当作函数编程中的lazy list,其中元素是tensor tuple。
tf.data.Dataset经常用来读入数据,处理数据,调整batch,epoch等操作,那读取数据常常依赖Iterator接口,我的其他博客会讲。
二 读数据方式
1. 最简单常用的方式: tf.data.Dataset.from_tensor_slices
>>>1. 将tensor沿第一个维度切片, 返回一个含有N个样本的数据集
>>>2. 得到的数据集是一个类对象,具有“迭代器”等函数,方便遍历数据集中的样本
>>>3. 它需要将整个数据集整体传入,然后做切片处理,这样比较占内存
features, labels = (np.random.sample((100,2)), np.random.sample((100,1)))
dataset = tf.data.Dataset.from_tensor_slices((features,labels))
2. tf.data.Dataset.from_generator()
>>>1.tf.data.Dataset.from_generator(data_generator,output_data_type,output_data_shape).
>>>2. 参数data_generator需要自定去定义,每次yield一个样本
>>>3. 这种方式可以通过自定义的生成器不断传入样本数据,可以通过dataset.prefetch(buffer_size=1000)中的buffer_size限制放入内存的样本的个数
sequence = np.array([[1, 3], [2, 3], [3, 4]])
def generator():
for el in sequence:
yield el
dataset = tf.data.Dataset.from_generator(generator,
output_types=(tf.float32),
output_shapes=(tf.TensorShape([1])))
3. tf.data.TextLineDataset
class TextLineDatasetV1(dataset_ops.DatasetV1Adapter):
"""A `Dataset` comprising lines from one or more text files."""
利用这种方式可以读取一个或者多个文件的数据
例:
dataset = tf.data.TextLineDataset(["filename1.txt", "filename2.txt", "filename3.txt"])
4. tf.data.TFRecordDataset
class TFRecordDatasetV1(dataset_ops.DatasetV1Adapter):
"""A `Dataset` comprising records from one or more TFRecord files."""
利用这种方式可以读取一个或者多个tfrecord格式的文件
例:
dataset = tf.data.TFRecordDataset(["filename1.tfrecords", "filename2.tfrecords", "filename3.tfrecords"])
5. tf.data.Dataset.list_files
这种方式可以模糊匹配所有文件,来处理数据
例:
dataset = tf.data.Dataset.list_files("filefloder/*.txt")
三 数据处理
构建好dataset之后,tf.data.Dataset的这几类常用方法也需要注意一下
- batch(): 用一个整型数字作参数,描述的是batch的batch size
- repeat(): 用一个整型数字做参数,作用是对整个dataset的重复次数,如果没有参数,则是重复无限次
- shuffle(): 数据打乱
- map(): 用作对数据做预处理,参数是一个函数句柄,dataset的每一个元素都会经过这个函数到新的tensor代替原来的元素
- apply(): 用作对数据做预处理,对整个Dataset重新塑造一个Dataset
- filter(): 数据集过滤
有兴趣可以看我的专栏: 今天你面试了吗?