一、TenorFlow读取文件方法
1、有三种获取数据到TensorFlow程序的方法
2、QueueRunner
基于队列的输入管道,从TensorFlow图形开头的文件中读取数据
注:TensorFlow2.0版本用tf.data模块代替了QueueRunner
3、Feeding
占位符 搭配 feed_dict使用
运行每一秒时,python代码提供数据
4、预加载数据
TensorFlow图中的张量包含所有数据(对于小数据集)
二、QueueRunner文件读取流程
1、第一阶段
构造文件名队列
2、第二阶段
读取与解码
3、第三阶段
批处理
4、手动开启线程
三、tf.data读取文件
1、tf.data的核心是tf.data.Dataset类
2、使用内存中的对象和张量创建数据集
(1)tf.data.Dataset.from_tensors()
读取单个元素数据集
(2)tf.data.Dataset.from_tensor_slices()
from_sensors生成一个仅包含单个元素的数据集。要将输入张量切片为多个元素,请使用from_sensor_slices
(3)例子
dataset = tf.data.Dataset.from_tensors([1, 2, 3])
dataset读取的是[array([1, 2, 3], dtype=int32)]
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset读取的是[1, 2, 3]三个元素
3、使用TFRecord格式创建数据集
tf.data.TFRocrdDataset()
4、使用文本文件创建数据集
tf.data.TextLineDataset()
其中每一行包含一个数据样本。一些示例包括日志消息,问题答案等
5、使用csv文件创建数据集
tf.data.experimental.CsvDataset()
tf.data.experimental.make_csv_dataset()提供更高级功能
6、数据集对象的预处理
tf.data.Dataset类为我们提供了多种数据集预处理方法
(1)Dataset.map(f)
对数据集中的每个元素应用函数f,得到一个新的数据集(这部分往往结合tf.io进行读写和解码文件,tf.image进行图像处理)
(2)Dataset.shuffle(buffer_size)
将数据集打乱(设定一个固定大小的缓冲区(Buffer),取出前buffer_size个元素放入,并从缓冲区中随机采样,采样后的数据用后续数据替换)
(3)Dataset.batch(batch_size)
将数据集分成批次,即对每batch_size个元素,使用tf.stack()在第0维合并,成为一个元素
(4)Dataset.prefetch()
预取出数据集中的若干个元素(可提升训练流程并行效率)
除此以外,还有Dataset.repeat()(重复数据集的元素)、Dataset.reduce()(与Map相对的聚合操作)、Dataset.take()(截取数据集中的前若干个元素)等,可参考API文档进一步了解
四、读取与解码
1、读取文件内容(以csv为例)
(1)读取csv存储位置形成一个文件名的dataset
(2)从这个dataset中读取csv文件并解析
(3)将读取的数据合并形成一个整个的dataset
五、内容解码
1、读取不同类型的文件,也应该对读取到的不同类型的内容进行相应的解码操作,解码成统一的Tensor格式
2、tf.io.decode_csv()
解码文本文件的内容
3、tf.io.decode_jpeg(contents)
将JPEG编码的图像解码为uint8张量
return:uint8张量,3-D形状[height, width, channels]
4、tf.io.decode_png(contents)
将PNG编码的图像解码为uint8张量或uint16张量
return:张量类型,3-D形状[height, width, channels]
5、tf.io.decode_raw(input_bytes, out_type)
解码二进制文件内容
6、解码阶段,默认所有的内容都解码成tf.uint8类型,如果之后需要转换成指定类型,则可使用tf.cast()进行相应转换
六、批处理
1、解码之后,可以直接获取默认的一个样本内容了,但如果想要获取多个样本,需要用批处理
2、tf.data.Dataset.batch(batch_size, drop_remainder=False, num_parallel_calls=None, deterministic=None)
将此数据集的batch_size个元素组合成一个元素
说明:
batch_size:从队列中读取的批处理大小
参考资料:
https://blog.csdn.net/u013421629/article/details/103556599
https://blog.csdn.net/wizardforcel/article/details/130197088
https://blog.csdn.net/qq_40913465/article/details/104790258