tensorflow数据篇(二)——tf.data.Dataset常用函数

动机

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值