展示如何将数据输入到计算图中
Dataset
可以看作是相同类型“元素”的有序列表,在实际使用时,单个元素可以是向量、字符串、图片甚至是tuple或dict。
数据集对象实例化:
迭代器对象实例化:
读取结束异常:如果一个dataset
中的元素被读取完毕,再尝试sess.run(one_element)
的话,会抛出tf.errors.OutOfRangeError
异常,这个行为与使用队列方式读取数据是一致的。
tf.data.Dataset.from_tensor_slices
真正作用是切分传入Tensor的第一个维度,生成相应的dataset,即第一维表明数据集中数据的数量,之后切分batch等操作均以第一维为基础。
输出:
输出:
Dataset
支持一类特殊操作:Transformation
。一个Dataset
通过Transformation
变成一个新的Dataset
。常用的Transformation
:
其中,
最简单的创建Iterator
方法是通过dataset.make_one_shot_iterator()
创建一个iterator。
除了这种iterator之外,还有更复杂的Iterator:
其中,initializable iterator方法要在使用前通过sess.run()
进行初始化,initializable iterator还可用于读入较大数组。在使用tf.data.Dataset.from_tensor_slices(array)
时,实际上发生的事情是将array作为一个tf.constants
保存到了计算图中,当array很大时,会导致计算图变得很大,给传输保存带来不便,这时可以使用一个placeholder
取代这里的array,并使用initializable iterator,只在需要时将array传进去,这样即可避免将大数组保存在图里。
对于文件名队列,使用tf.train.string_input_producer()
函数,tf.train.string_input_producer()
还有两个重要参数,num_epoches
和shuffle
内存队列不需要我们建立,只需要使用reader
对象从文件名队列中读取数据即可,使用tf.train.start_queue_runners()
函数启动队列,填充两个队列的数据。