Tensorflow分批量读取数据教程
之前的博客里使用tf读取数据都是每次fetch一条记录,实际上大部分时候需要fetch到一个batch的小批量数据,在tf中这一操作的明显变化就是tensor的rank发生了变化,我目前使用的人脸数据集是灰度图像,因此大小是92*112的,所以最开始fetch拿到的图像数据集经过reshape之后就是一个rank为2的tensor,大小是92*112的(如果考虑通道,也可以reshape为rank为3的,即92*112*1)。如果加入batch,比如batch大小为5,那么拿到的tensor的rank就变成了3,大小为5*92*112。
下面规则化的写一下读取数据的一般流程,按照官网的实例,一般把读取数据拆分成两个大部分,一个是函数专门负责读取数据和解码数据,一个函数则负责生产batch。
importtensorflowastf defread_data(fileNameQue): reader=tf.TFRecordReader() key,value=reader.read(fileNameQue) features=tf.parse_single_example(value,features={'label':tf.FixedLenFeature([],tf.int64), 'img':tf.FixedLenFeature([],tf.string),}) img=tf.decode_raw(features["img"],tf.uint8) img=tf.reshape(img,[92,112])#恢复图像原始大小 label=tf.cast(features["label"],tf.int32) returnimg,label defbatch_input(filename,batchSize): fileNameQue=tf.train.string_input_producer([filename],shuffle=True) img,label=read_data(fileNameQue)#fetch图像和label min_after_dequeue=1000 capacity=min_after_dequeue+3*batchSize #预取图像和label并随机打乱,组成batch,此时tensorrank发生了变化,多了一个batch大小的维度 exampleBatch,labelBatch=tf.train.shuffle_batch([img,label],batch_size=batchSize,capacity=capacity, min_after_dequeue=min_after_dequeue) returnexampleBatch,labelBatch if__name__=="__main__": init=tf.initialize_all_variables() exampleBatch,labelBatch=batch_input("./data/faceTF.tfrecords",batchSize=10) withtf.Session()assess: sess.run(init) coord=tf.train.Coordinator() threads=tf.train.start_queue_runners(coord=coord) foriinrange(100): example,label=sess.run([exampleBatch,labelBatch]) print(example.shape) coord.request_stop() coord.join(threads)
读取数据和解码数据与之前基本相同,针对不同格式数据集使用不同阅读器和解码器即可,后面是产生batch,核心是tf.train.shuffle_batch这个函数,它相当于一个蓄水池的功能,第一个参数代表蓄水池的入水口,也就是逐个读取到的记录,batch_size自然就是batch的大小了,capacity是蓄水池的容量,表示能容纳多少个样本,min_after_dequeue是指出队操作后还可以供随机采样出批量数据的样本池大小,显然,capacity要大于min_after_dequeue,官网推荐:min_after_dequeue+(num_threads+asmallsafetymargin)*batch_size,还有一个参数就是num_threads,表示所用线程数目。
min_after_dequeue这个值越大,随机采样的效果越好,但是消耗的内存也越大。
以上这篇Tensorflow分批量读取数据教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。