占位符 & feed_dict搭配使用
QueueRunner
通用文件读取流程
图片、二进制数据、TFRecords
一、文件读取流程
多线程 + 队列
1)构造文件名队列
file_queue = tf.train.string_input_producer(string_tensor,shuffle = True)
# string_tensor: 含有文件名+路径的一阶张量,一般传入一个列表
# shuffle:打乱文件名
# return 文件队列
2)读取与解码
# 读取文本文件,默认按行读取
reader = tf.TextLineReader()
# 读取图片文件
reader = tf.WholeFileReader()
# 读取二进制文件,每个记录为固定字节
# record_bytes:指定每次读取一个样本的字节数
reader = tf.FixedLengthRecordReader(record_bytes)
#读取TFRecords文件
reader = tf.TFRecordReader()
# 读取器实例化后,通过read()方法读取数据
key,value = reader.read(file_queque)
# key:文件名;value:一个样本
# 内容解码
decoded = tf.decode_csv() # 解码文本文件内容
decoded = tf.image.decode_jpeg(contents) # 将JPEG图片解码为unit8张量;return:unit8张量,3—D形状[height,width,channels]
decoded = tf.image.decode_png(contents) # 将PNG图片解码为unit8张量
decoded = tf.decode_raw() # 解码二进制文件内容,二进制都区委unit8类型
# 解码阶段默认读取为unit8类型,可以通过tf.cast转换
# 图片解码后需要将形状固定才可进行批处理
decoded.setshape([height,width,channels])
# 修改图片的类型以保证之后的精度
image_cast = tf.cast(decoded, tf.float32)
3)批处理队列
tf.train.batch(tensors,batch_size,num_threads = 1,capacity=32,name=None)
# 读取指定个数的张量
# tensors:可以是包含张量的列表,批处理的内容放到列表当中
# batch_size: 从队列中读取的批处理大小
# num_threads:进入队列的线程数
# capacity:队列中元素的最大数量
# return:tensors
tf.train.shuffle_batch
手动开启线程
with tf.Session() as sess:
# 必须开启线程之后才能实现上述步骤
# 创建线程管理器,对线程进行管理和协调
coord = tf.train.Coordinator()
mythread = tf.train.start_queue_runnners(sess=sess,coord=coord)
# 回收线程,线程使用完之后需回收
coord.request_stop()
coord.join(mythread)