TensorFlow程序读取数据一共有3种方法:
Preloaded data:预加载数据。
Feeding:利用python读取原始数据,将数据feed到图中。
Reading from file:从文件中直接读取。
方式一
预加载数据: 在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。
直接读取数据到内存, 形成tf自己类的dataset
适合小数据
方式二
供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。
每次从硬盘存一个batch的数据到内存中,然后送入到占位符中,在图中进行计算。这种方式的优势在于训练过程只需要一个batch的内存
是最常用的方法
import tensorflow as tf
# 设计graph,用占位符代替
x = tf.placeholder(tf.int16)
y = tf.placeholder(tf.int16)
z = tf.add(x,y, name='z')
# 打开一个session
with tf.Session() as sess:
# 创建数据
xs = [1,2,3]
ys = [2,3,4]
# 运行session,用feed_dict来将创建的数据传递进占位符
print(sess.run(z, feed_dict={x: xs, y: ys}))
但是这种方式也有很大缺陷,就是当数据规模较大的时候,也会出现数据传输的较大时间损耗,效率偏低。这里的传输只从python读入的数据传入到图中计算的数据,这之间存在一个数据转换的问题。
训练每个batch都需要停下GPU计算图的脚步去读取一个batch的数据
方式三
从文件读取数据: 在TensorFlow图的起始, 让一个输入管道从文件中读取数据。
TF提供一种双线程的方法,读取数据的线程不断将文件系统中的图片读入,另一个线程则是负责计算,计算需要的数据直接从内存中取即可。
三个接口:
tf.data.TFRecordDataset
tf.data.TextLineDataset
tf.contrib.data.CsvDataset
tensorflow TextLineDataset
tf.data.TextLineDataset 接口提供了一种方法从数据文件中读取。我们提供只需要提供文件名(1个或者多个)。这个接口会自动构造一个dataset,类中保存的元素:文中一行,就是一个元素,是string类型的tensor。
这篇讲的非常好:
https://zhuanlan.zhihu.com/p/40243876
参考链接
https://zhuanlan.zhihu.com/p/163656225
https://tensorflow.google.cn/api_docs/python/tf/data/TextLineDataset?hl=zh-CN
https://www.cnblogs.com/wj-1314/p/11211333.html
https://zhuanlan.zhihu.com/p/138099468