动机
tf.data.Dataset用来构建数据输入管道,其涉及许多重要函数,总结在此,为下节准备。
目标
了解tf.data.Dataset必备的函数功能,以及参数作用,仅仅涉及图像处理。
tf.data.Dataset常用函数
Dataset
表示一个元素的集合,可以看作函数式编程中的 lazy list, 元素是tensor tuple。创建Dataset
的方式可以分为两种,分别是:
作用分别为:从一个tensor tuple创建一个单元素的dataset;从一个tensor tuple创建一个包含多个元素的dataset;读取一个文件名列表,将每个文件中的每一行作为一个元素,构成一个dataset;读取硬盘中的TFRecord
格式文件,构造dataset。
- Source:
-
tf.data.Dataset.from_tensors((features, labels)) tf.data.Dataset.from_tensor_slices((features, labels)) tf.data.TextLineDataset(filenames) tf.data.TFRecordDataset(filenames)
- Apply transformation:
-
dataset.map(lambda x: tf.decode_jpeg(x)) dataset.repeat(NUM_EPOCHS) dataset.batch(BATCH_SIZE)
以上三种方式分别表示了:使用map对dataset中的每个元素进行处理,这里的例子是对图片数据进行解码;将dataset重复一定数目的次数用于多个epoch的训练;将原来的dataset中的元素按照某个数量叠在一起,生成mini batch。
Iterator
创建dataset实例后,dataset可以调用Iterator接口来访问数据集中的tensor tuple,iterator保持了数据在数据集中的位置,提供了访问数据集中数据的方法。
API包含下列四种:
- one-shot
- initializable
- reinitializable
- feedable
one-shot仅支持对整个数据集访问一遍,不需要显示的初始化。one-shot不支持参数化
dataset = tf.data.Dataset.range(100)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()
for i in range(100):
value = see.run(next_element)
assert i == value
initializable
Initializable iterator要求使用之前显示的通过调用iterator.initializer操作初始化,这使得在定义数据及时可以结合tf.placeholder传入参数,如
max_value = tf.placeholder(tf.int64, shape=[])
dataset = tf.data.Dataset.range(max_value)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()
#Initialize an iterator over a dataset with 10 elements
sess.run(iterator.initializer, feed_dict={max_value:10})
for i in range(10):
value = sess.run(next_element)
assert i == value
#Initialize the same iterator over a dataset with 100 elements.
sess.run(iterator.initializer, feed_dict={max_value:100})
for i in range(100):
values = sess.run(next_element)
assert i == value
reinitializable
reinitializable iterator可以被不同的datset对象初始化,例如对于训练集进行了shuffle的操作,对于验证集则没有处理,
通常这种情况会使用两个具有相同结构的dataset对象,如:
# Define training and validation datsets with the same structure.
training_dataset = tf.data.Dataset.range(100).map(
lambda x:x + tf.random_uniform(), -10, 10, tf.int64))
validation_dataset = tf.data.Dataset.range(50)
# A reinitializable iterator is defined by its structure.We could use the 'output_type
# here,because they are compatiable.
iterator = tf.Iterator.from_structure(training_dataset.output_types,
training_dataset.output_shapes)
next_element = iterator.get_next()
training_init_op = iterator.make_initializer(training_dataset)
validation_init_op = iterator.make_initializer(validation_dataset)
#Initialize an iterator over validation dataset
sess.run(validation_init_op)
for _ in range(50):
sess.run(next_element)
参考https://blog.csdn.net/DumpDoctorWang/article/details/84028957#3_50