TF数据读取队列机制详解

一、TFR文件多线程队列读写操作

TFRecod文件写入操作

import tensorflow as tf
def _int64_feature(value):# value必须是可迭代对象# 非int的数据使用bytes取代int64即可return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
num_shards = 2
instance_perPshard = 2
for i in range(num_shards):filename = ('FTR/data.tfrecords-%.5d-of-%.5d' % (i, num_shards))writer = tf.python_io.TFRecordWriter(filename)                      #<---------书写器打开for j in range(instance_perPshard):example = tf.train.Example(features=tf.train.Features(feature={ #<---------书写入缓冲区'i':_int64_feature(i),'j':_int64_feature(j)}))writer.write(example.SerializeToString())                       #<---------书写入实际文件writer.close()                                                      #<---------书写器关闭

TFRecod文件读取操作

默认多线程,这个默认的多线程过程用于维护文件名队列

'''读取TFR'''files = ["FTR/data.tfrecords-00000-of-00002","FTR/data.tfrecords-00001-of-00002"]
# files = tf.train.match_filenames_once("FTR/data.tfrecords-*")# 输入文件名列表
# 返回QueueRunner & FIFOQueue
# 打乱顺序&加入队列 和 输出队列获取文件 属于单独的线程
filename_queue = tf.train.string_input_producer(files, shuffle=False) #<---------输入文件队列
reader = tf.TFRecordReader()                        #<---------读取器打开
_,serialized_example = reader.read(filename_queue)  #<---------读取原始文件
features = tf.parse_single_example(                 #<---------读取解析后文件serialized_example,features={'i':tf.FixedLenFeature([],tf.int64),'j':tf.FixedLenFeature([],tf.int64)})with tf.Session() as sess:tf.global_variables_initializer().run()coord = tf.train.Coordinator() #<---------多线程threads = tf.train.start_queue_runners(sess=sess,coord=coord) #<---------文件名队列填充线程启动for i in range(6):print(sess.run([features['i'],features['j']]))            #<---------实际会话中启动读取过程coord.request_stop()           #<---------多线程coord.join(threads)            #<---------多线程

TFRecod文件打包操作

打包机制:

——————多线程调用前面的节点计算入队

——————批量出队并打包

所以不需要修改解析读取数据过程为循环之类的,可以说很是方便

example_batch, label_batch = tf.train.batch([example, label],     #<---------多线程batch生成batch_size=batch_size,num_threads=3,capacity=capacity)example_batch, label_batch = tf.train.shuffle_batch([example, label],     #<---------多线程随机batch生成batch_size=batch_size,num_threads=3,capacity=capacity,min_after_dequeue=30)     由于元素太少随机意义就不大了,所以多了个参数

使用范例,

files = ["FTR/data.tfrecords-00000-of-00002","FTR/data.tfrecords-00001-of-00002"]
# files = tf.train.match_filenames_once("FTR/data.tfrecords-*")# 输入文件名列表
# 返回QueueRunner & FIFOQueue
# 打乱顺序&加入队列 和 输出队列获取文件 属于单独的线程
filename_queue = tf.train.string_input_producer(files, shuffle=False) #<---------输入文件队列
reader = tf.TFRecordReader()                        #<---------读取
_,serialized_example = reader.read(filename_queue)  #<---------读取
features = tf.parse_single_example(                 #<---------读取serialized_example,features={'i':tf.FixedLenFeature([],tf.int64),'j':tf.FixedLenFeature([],tf.int64)})example, label = features['i'], features['j']
batch_size = 2
capacity = 1000 + 3 * batch_size# 入队单个样例,出队batch
# 可以指定多个线程同时执行入队操作
example_batch, label_batch = tf.train.batch([example, label],     #<---------多线程batch生成batch_size=batch_size,num_threads=3,capacity=capacity)
with tf.Session() as sess:tf.global_variables_initializer().run()coord = tf.train.Coordinator()                                #<---------多线程管理器threads = tf.train.start_queue_runners(sess=sess,coord=coord) #<---------文件名队列填充线程启动for i in range(3):cur_example_batch, cur_label_batch = sess.run([example_batch, label_batch])print(cur_example_batch, cur_label_batch)coord.request_stop()                                          #<---------多线程关闭coord.join(threads)

这个输出每一行前为image(代指),后为label,第一行的数据对实际为0-0,0-1:

[0 0] [0 1]
[1 1] [0 1]
[0 0] [0 1]

二、图片文件使用TFR读写测试

read的二进制数据直接进行_bytes_feature化就可以写入文件,使用tf.string类型读出图片数据后可以直接decode解码之(推测tf中string对应二进制数据类型)。

把一张图片写入TFR中:

import tensorflow as tf
import matplotlib.pyplot as pltdef _bytes_feature(value):return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _int64_feature(value):return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
img_raw = tf.gfile.FastGFile('123123.jpeg','rb').read()filename = ('FTR/image.tfrecords')
writer = tf.python_io.TFRecordWriter(filename) #<---------书写
example = tf.train.Example(features=tf.train.Features(feature={ #<---------书写'image':_bytes_feature(img_raw),'label':_int64_feature(1)}))
writer.write(example.SerializeToString()) #<---------书写
writer.close()

从TFR中读取图片数据并解码绘制出来:

filename_queue = tf.train.string_input_producer(['FTR/image.tfrecords'], shuffle=False) #<---------输入文件队列
reader = tf.TFRecordReader()                        #<---------读取
_,serialized_example = reader.read(filename_queue)  #<---------读取
features = tf.parse_single_example(                 #<---------读取serialized_example,features={'image':tf.FixedLenFeature([],tf.string),'label':tf.FixedLenFeature([],tf.int64)})
img = tf.image.decode_jpeg(features['image'])
with tf.Session() as sess:tf.global_variables_initializer().run()coord = tf.train.Coordinator()  # <---------多线程threads = tf.train.start_queue_runners(sess=sess, coord=coord)  # <---------文件名队列填充线程启动# img_raw, label = sess.run([features['image'], features['label']])image = sess.run(img)plt.imshow(image)plt.show()coord.request_stop()  # <---------多线程coord.join(threads)  # <---------多线程

三、图片文件直接使用队列读写操作

仅仅示范了维护图片文件名队列的读写,没有过多的其他操作

reader = tf.WholeFileReader():新的读取器,应该是范用性二进制文件读取器

# 导入tensorflow
import tensorflow as tf# 新建一个Session
with tf.Session() as sess:# 我们要读三幅图片A.jpg, B.jpg, C.jpgfilename = ['123.png', '123123.jpeg']# string_input_producer会产生一个文件名队列filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)# reader从文件名队列中读数据。对应的方法是reader.readreader = tf.WholeFileReader()                             #<---------注意读取器不一样了key, value = reader.read(filename_queue)# tf.train.string_input_producer定义了一个epoch变量,要对它进行初始化tf.local_variables_initializer().run()# 使用start_queue_runners之后,才会开始填充队列threads = tf.train.start_queue_runners(sess=sess)i = 0while True:i += 1# 获取图片数据并保存image_data = sess.run(value)with open('test_%d.jpg' % i, 'wb') as f:f.write(image_data)

四、队列文件使用范式

文件名队列创建->读取解析文件->打包解析好的文件->多线程启动图训练(多线程指被使用的部分其实还是文件读取)

import tensorflow as tf'''创建文件列表'''files = tf.train.match_filenames_once("Records/output.tfrecords")
filename_queue = tf.train.string_input_producer(files, shuffle=False)'''解析TFRecord文件里的数据'''# 读取文件。reader = tf.TFRecordReader()
_,serialized_example = reader.read(filename_queue)# 解析读取的样例。
features = tf.parse_single_example(serialized_example,features={'image_raw':tf.FixedLenFeature([],tf.string),'pixels':tf.FixedLenFeature([],tf.int64),'label':tf.FixedLenFeature([],tf.int64)})decoded_images = tf.decode_raw(features['image_raw'],tf.uint8)
retyped_images = tf.cast(decoded_images, tf.float32)
labels = tf.cast(features['label'],tf.int32)
#pixels = tf.cast(features['pixels'],tf.int32)
images = tf.reshape(retyped_images, [784])'''将文件以100个为一组打包'''min_after_dequeue = 10000
batch_size = 100
capacity = min_after_dequeue + 3 * batch_sizeimage_batch, label_batch = tf.train.shuffle_batch([images, labels],batch_size=batch_size,capacity=capacity,min_after_dequeue=min_after_dequeue)'''训练模型'''def inference(input_tensor, weights1, biases1, weights2, biases2):layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)return tf.matmul(layer1, weights2) + biases2# 模型相关的参数
INPUT_NODE = 784
OUTPUT_NODE = 10
LAYER1_NODE = 500
REGULARAZTION_RATE = 0.0001
TRAINING_STEPS = 5000weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))y = inference(image_batch, weights1, biases1, weights2, biases2)# 计算交叉熵及其平均值
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=label_batch)
cross_entropy_mean = tf.reduce_mean(cross_entropy)# 损失函数的计算
regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
regularaztion = regularizer(weights1) + regularizer(weights2)
loss = cross_entropy_mean + regularaztion# 优化损失函数
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)# 初始化回话并开始训练过程。
with tf.Session() as sess:tf.global_variables_initializer().run()coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 循环的训练神经网络。for i in range(TRAINING_STEPS):if i % 1000 == 0:print("After %d training step(s), loss is %g " % (i, sess.run(loss)))sess.run(train_step)coord.request_stop()coord.join(threads)

『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌相关推荐

  1. 『TensorFlow』第七弹_保存载入会话_霸王回马

    首更: 由于TensorFlow的奇怪形式,所以载入保存的是sess,把会话中当前激活的变量保存下来,所以必须保证(其他网络也要求这个)保存网络和载入网络的结构一致,且变量名称必须一致,这是caffe ...

  2. 『PyTorch』第十一弹_torch.optim优化器 每层定制参数

    一.简化前馈网络LeNet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 im ...

  3. python 动漫卡通人物图片大全,『TensorFlow』DCGAN生成动漫人物头像_下

    一.计算图效果以及实际代码实现 计算图效果 实际模型实现 相关介绍移步我的github项目. 二.生成器与判别器设计 生成器 相关参量, 噪声向量z维度:100 标签向量y维度:10(如果有的话) 生 ...

  4. 『TensorFlow』模型载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  5. 『TensorFlow』分布式训练_其二_单机多GPU并行GPU模式设定

    建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...

  6. 『TensorFlow』函数查询列表_张量属性调整

    博客园 首页 新随笔 新文章 联系 订阅 管理 『TensorFlow』函数查询列表_张量属性调整 数据类型转换Casting 操作 描述 tf.string_to_number (string_te ...

  7. 『TensorFlow』DCGAN生成动漫人物头像_下

    『TensorFlow』以GAN为例的神经网络类范式 『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 『TensorFlow』通过代码理解gan网络_中 一.计算 ...

  8. 『TensorFlow』命令行参数解析

    argparse很强大,但是我们未必需要使用这么繁杂的东西,TensorFlow自己封装了一个简化版本的解析方式,实际上是对argparse的封装 脚本化调用tensorflow的标准范式: impo ...

  9. 『TensorFlow』专题汇总

    TensorFlow函数查询 『TensorFlow』0.x_&_1.x版本框架改动汇总 『TensorFlow』函数查询列表_数值计算 『TensorFlow』函数查询列表_张量属性调整 『 ...

最新文章

  1. 二进制除法\模2除法
  2. Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
  3. 《Python Cookbook 3rd》笔记(4.6):带有外部状态的生成器函数
  4. android 开发传输安全,移动应用安全开发指南(Android)--数据传输
  5. Pyplot绘制多幅图形/多个数据的方法
  6. 这是我的第一个用例图
  7. 非名校毕业,如何在六天面试六家顶尖科技公司,并拿到全部Offer?
  8. Kotlin实战【二】Kotlin基本要素
  9. c语言中平方根怎么用算法表示,C语言中平方根实现的详细分析
  10. 深圳大学计算机与科学考研科目,2020深圳大学计算机专业课不考408了
  11. 每个故事是一座布满灰尘的城墙
  12. android红外线开发实例,Android实例-红外线操作(XE10.2+小米5)
  13. C语言入门(前期准备工作)——超级详细的建议和教学,带你顺利跨越编程门槛
  14. 爬取起点中文网站原创风云榜小说排行
  15. 如何学习图像处理(计算机视觉)的一些思考与分享
  16. 服务机器人 开源_让机器为我们服务而不是我们为他们服务
  17. ccflow 代码分析
  18. DenseNet模型解读
  19. 云计算——第七天(寒假)
  20. 链游开发,链游源码出售,基于Dapp合约的链上游戏

热门文章

  1. JAVA操作Hadoop
  2. [AT2369] [agc013_c] Ants on a Circle
  3. cxf restful
  4. ActionScript工程如何使用Flash CS的fl包中的UI组件(转)
  5. [恢]hdu 1259
  6. 现代C++函数式编程
  7. Git log高级用法
  8. bootstrap回顾
  9. colpick-jQuery颜色选择器使用说明
  10. D3DX 9.9 LEARNERNOTO