机器学习Tensorflow基本操作:线程队列图像

一、线程和队列

在使用TensorFlow进行异步计算时,队列是一种强大的机制。

为了感受一下队列,让我们来看一个简单的例子。我们先创建一个“先入先出”的队列(FIFOQueue),并将其内部所有元素初始化为零。然后,我们构建一个TensorFlow图,它从队列前端取走一个元素,加上1之后,放回队列的后端。慢慢地,队列的元素的值就会增加。

TensorFlow提供了两个类来帮助多线程的实现:tf.Coordinator和 tf.QueueRunner。Coordinator类可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,QueueRunner类用来协调多个工作线程同时将多个张量推入同一个队列中。

队列概述

队列,如FIFOQueue和RandomShuffleQueue,在TensorFlow的张量异步计算时都非常重要。

例如,一个典型的输入结构:是使用一个RandomShuffleQueue来作为模型训练的输入:

  • 多个线程准备训练样本,并且把这些样本推入队列。
  • 一个训练线程执行一个训练操作

同步执行队列

# 创建一个队列
Q = tf.FIFOQueue(3, dtypes=tf.float32)# 数据进队列
init = Q.enqueue_many(([0.1, 0.2, 0.3],))# 定义操作,op,出队列,+1,进队列,注意返回的都是op
out_q = Q.dequeue()
data = out_q + 1
en_q = Q.enqueue(data)with tf.Session() as sess:# 初始化队列,是数据进入sess.run(init)# 执行两次入队加1for i in range(2):sess.run(en_q)# 循环取队列for i in range(3):print(sess.run(Q.dequeue()))

tf.QueueRunner

QueueRunner类会创建一组线程, 这些线程可以重复的执行Enquene操作, 他们使用同一个Coordinator来处理线程同步终止。此外,一个QueueRunner会运行一个closer thread,当Coordinator收到异常报告时,这个closer thread会自动关闭队列。

您可以使用一个queue runner,来实现上述结构。 首先建立一个TensorFlow图表,这个图表使用队列来输入样本。增加处理样本并将样本推入队列中的操作。增加training操作来移除队列中的样本。

tf.Coordinator

Coordinator类用来帮助多个线程协同工作,多个线程同步终止。 其主要方法有:

  • should_stop():如果线程应该停止则返回True。
  • request_stop(): 请求该线程停止。
  • join():等待被指定的线程终止。

首先创建一个Coordinator对象,然后建立一些使用Coordinator对象的线程。这些线程通常一直循环运行,一直到should_stop()返回True时停止。 任何线程都可以决定计算什么时候应该停止。它只需要调用request_stop(),同时其他线程的should_stop()将会返回True,然后都停下来。

异步执行队列:

#主线程,不断的去取数据,开启其它线程来进行增加计数,入队
#主线程结束了,队列线程没有结束,就会抛出异常
#主线程没有结束,需要将队列线程关闭,防止主线程等待Q = tf.FIFOQueue(1000,dtypes=tf.float32)# 定义操作
var = tf.Variable(0.0)
increment_op = tf.assign_add(var,tf.constant(1.0))
en_op = Q.enqueue(increment_op)# 创建一个队列管理器,指定线程数,执行队列的操作
qr = tf.train.QueueRunner(Q,enqueue_ops=[increment_op,en_op]*3)with tf.Session() as sess:tf.global_variables_initializer().run()# 生成一个线程协调器coord = tf.train.Coordinator()# 启动线程执行操作threads_list = qr.create_threads(sess,coord=coord,start=True)print(len(threads_list),"----------")# 主线程去取数据for i in range(20):print(sess.run(Q.dequeue()))# 请求其它线程终止coord.request_stop()# 关闭线程coord.join(threads_list)

二、读取数据

小数量数据读取

这仅用于可以完全加载到存储器中的小的数据集有两种方法:

  • 存储在常数中。
  • 存储在变量中,初始化后,永远不要改变它的值。

使用常数更简单一些,但是会使用更多的内存,因为常数会内联的存储在数据流图数据结构中,这个结构体可能会被复制几次。

training_data = ...
training_labels = ...
with tf.Session():input_data = tf.constant(training_data)input_labels = tf.constant(training_labels)

要改为使用变量的方式,您就需要在数据流图建立后初始化这个变量。

training_data = ...
training_labels = ...
with tf.Session() as sess:data_initializer = tf.placeholder(dtype=training_data.dtype,shape=training_data.shape)label_initializer = tf.placeholder(dtype=training_labels.dtype,shape=training_labels.shape)input_data = tf.Variable(data_initalizer, trainable=False, collections=[])input_labels = tf.Variable(label_initalizer, trainable=False, collections=[])...sess.run(input_data.initializer,feed_dict={data_initializer: training_data})sess.run(input_labels.initializer,feed_dict={label_initializer: training_lables})

设定trainable=False可以防止该变量被数据流图的GraphKeys.TRAINABLE_VARIABLES收集,这样我们就不会在训练的时候尝试更新它的值;设定collections=[]可以防止GraphKeys.VARIABLES收集后做为保存和恢复的中断点。设定这些标志,是为了减少额外的开销

文件读取

先看下文件读取以及读取数据处理成张量结果的过程:

一般数据文件格式有文本、excel和图片数据。那么TensorFlow都有对应的解析函数,除了这几种。还有TensorFlow指定的文件格式。

标准TensorFlow格式

TensorFlow还提供了一种内置文件格式TFRecord,二进制数据和训练类别标签数据存储在同一文件。模型训练前图像等文本信息转换为TFRecord格式。TFRecord文件是protobuf格式。数据不压缩,可快速加载到内存。TFRecords文件包含 tf.train.Example protobuf,需要将Example填充到协议缓冲区,将协议缓冲区序列化为字符串,然后使用该文件将该字符串写入TFRecords文件。在图像操作我们会介绍整个过程以及详细参数。

数据读取实现

文件队列生成函数

  • tf.train.string_input_producer(string_tensor, num_epochs=None, shuffle=True, seed=None, capacity=32, name=None)

产生指定文件张量

文件阅读器类

  • class tf.TextLineReader

阅读文本文件逗号分隔值(CSV)格式

  • tf.FixedLengthRecordReader

要读取每个记录是固定数量字节的二进制文件

  • tf.TFRecordReader

读取TfRecords文件

解码

由于从文件中读取的是字符串,需要函数去解析这些字符串到张量

  • tf.decode_csv(records,record_defaults,field_delim = None,name = None)将CSV转换为张量,与tf.TextLineReader搭配使用

  • tf.decode_raw(bytes,out_type,little_endian = None,name = None) 将字节转换为一个数字向量表示,字节为一字符串类型的张量,与函数tf.FixedLengthRecordReader搭配使用

生成文件队列

将文件名列表交给tf.train.string_input_producer函数。string_input_producer来生成一个先入先出的队列,文件阅读器会需要它们来取数据。string_input_producer提供的可配置参数来设置文件名乱序和最大的训练迭代数,QueueRunner会为每次迭代(epoch)将所有的文件名加入文件名队列中,如果shuffle=True的话,会对文件名进行乱序处理。一过程是比较均匀的,因此它可以产生均衡的文件名队列。

这个QueueRunner工作线程是独立于文件阅读器的线程,因此乱序和将文件名推入到文件名队列这些过程不会阻塞文件阅读器运行。根据你的文件格式,选择对应的文件阅读器,然后将文件名队列提供给阅读器的 read 方法。阅读器的read方法会输出一个键来表征输入的文件和其中纪录(对于调试非常有用),同时得到一个字符串标量,这个字符串标量可以被一个或多个解析器,或者转换操作将其解码为张量并且构造成为样本。

# 读取CSV格式文件
# 1、构建文件队列# 2、构建读取器,读取内容# 3、解码内容# 4、现读取一个内容,如果有需要,就批处理内容
import tensorflow as tf
import os
def readcsv_decode(filelist):"""读取并解析文件内容:param filelist: 文件列表:return: None"""# 把文件目录和文件名合并flist = [os.path.join("./csvdata/",file) for file in filelist]# 构建文件队列file_queue = tf.train.string_input_producer(flist,shuffle=False)# 构建阅读器,读取文件内容reader = tf.TextLineReader()key,value = reader.read(file_queue)record_defaults = [["null"],["null"]] # [[0],[0],[0],[0]]# 解码内容,按行解析,返回的是每行的列数据example,label = tf.decode_csv(value,record_defaults=record_defaults)# 通过tf.train.batch来批处理数据example_batch,label_batch = tf.train.batch([example,label],batch_size=9,num_threads=1,capacity=9)with tf.Session() as sess:# 线程协调员coord = tf.train.Coordinator()# 启动工作线程threads = tf.train.start_queue_runners(sess,coord=coord)# 这种方法不可取# for i in range(9):#     print(sess.run([example,label]))# 打印批处理的数据print(sess.run([example_batch,label_batch]))coord.request_stop()coord.join(threads)return Noneif __name__=="__main__":filename_list = os.listdir("./csvdata")readcsv_decode(filename_list)

每次read的执行都会从文件中读取一行内容,注意,(这与后面的图片和TfRecords读取不一样),decode_csv操作会解析这一行内容并将其转为张量列表。如果输入的参数有缺失,record_default参数可以根据张量的类型来设置默认值。在调用run或者eval去执行read之前,你必须调用tf.train.start_queue_runners来将文件名填充到队列。否则read操作会被阻塞到文件名队列中有值为止。


三、图像操作

图像基本概念

在图像数字化表示当中,分为黑白和彩色两种。在数字化表示图片的时候,有三个因素。分别是图片的长、图片的宽、图片的颜色通道数。那么黑白图片的颜色通道数为1,它只需要一个数字就可以表示一个像素位;而彩色照片就不一样了,它有三个颜色通道,分别为RGB,通过三个数字表示一个像素位。TensorFlow支持JPG、PNG图像格式,RGB、RGBA颜色空间。图像用与图像尺寸相同(heightwidthchnanel)张量表示。图像所有像素存在磁盘文件,需要被加载到内存。

图像大小压缩

大尺寸图像输入占用大量系统内存。训练CNN需要大量时间,加载大文件增加更多训练时间,也难存放多数系统GPU显存。大尺寸图像大量无关本征属性信息,影响模型泛化能力。最好在预处理阶段完成图像操作,缩小、裁剪、缩放、灰度调整等。图像加载后,翻转、扭曲,使输入网络训练信息多样化,缓解过拟合。Python图像处理框架PIL、OpenCV。TensorFlow提供部分图像处理方法。

  • tf.image.resize_images 压缩图片导致定大小

图像数据读取实例

同样图像加载与二进制文件相同。图像需要解码。输入生成器(tf.train.string_input_producer)找到所需文件,加载到队列。tf.WholeFileReader 加载完整图像文件到内存,WholeFileReader.read 读取图像,tf.image.decode_jpeg 解码JPEG格式图像。图像是三阶张量。RGB值是一阶张量。加载图像格式为[batch_size,image_height,image_width,channels]。批数据图像过大过多,占用内存过高,系统会停止响应。直接加载TFRecord文件,可以节省训练时间。支持写入多个样本。

读取图片数据到Tensor

管道读端多文件内容处理

但是会发现read只返回一个图片的值。所以我们在之前处理文件的整个流程中,后面的内容队列的出队列需要用特定函数去获取。

  • tf.train.batch 读取指定大小(个数)的张量
  • tf.train.shuffle_batch 乱序读取指定大小(个数)的张量
def readpic_decode(file_list):"""批量读取图片并转换成张量格式:param file_list: 文件名目录列表:return: None"""# 构造文件队列file_queue = tf.train.string_input_producer(file_list)# 图片阅读器和读取数据reader = tf.WholeFileReader()key,value = reader.read(file_queue)# 解码成张量形式image_first = tf.image.decode_jpeg(value)print(image_first)# 缩小图片到指定长宽,不用指定通道数image = tf.image.resize_images(image_first,[256,256])# 设置图片的静态形状image.set_shape([256,256,3])print(image)# 批处理图片数据,tensors是需要具体的形状大小image_batch = tf.train.batch([image],batch_size=100,num_threads=1,capacity=100)tf.summary.image("pic",image_batch)with tf.Session() as sess:merged = tf.summary.merge_all()filewriter = tf.summary.FileWriter("/tmp/summary/dog/",graph=sess.graph)# 线程协调器coord = tf.train.Coordinator()# 开启线程threads = tf.train.start_queue_runners(sess=sess,coord=coord)print(sess.run(image_batch))summary = sess.run(merged)filewriter.add_summary(summary)# 等待线程回收coord.request_stop()coord.join(threads)return Noneif __name__=="__main__":# 获取文件列表filename = os.listdir("./dog/")# 组合文件目录和文件名file_list = [os.path.join("./dog/",file) for file in filename]# 调用读取函数readpic_decode(file_list)

读取TfRecords文件数据

#CIFAR-10的数据读取以及转换成TFRecordsg格式#1、数据的读取FLAGS = tf.app.flags.FLAGStf.app.flags.DEFINE_string("data_dir","./cifar10/cifar-10-batches-bin/","CIFAR数据目录")
tf.app.flags.DEFINE_integer("batch_size",50000,"样本个数")
tf.app.flags.DEFINE_string("records_file","./cifar10/cifar.tfrecords","tfrecords文件位置")class CifarRead(object):def __init__(self,filename):self.filelist = filename# 定义图片的长、宽、深度,标签字节,图像字节,总字节数self.height = 32self.width = 32self.depth = 3self.label_bytes = 1self.image_bytes = self.height*self.width*self.depthself.bytes = self.label_bytes + self.image_bytesdef readcifar_decode(self):"""读取数据,进行转换:return: 批处理的图片和标签"""# 1、构造文件队列file_queue = tf.train.string_input_producer(self.filelist)# 2、构造读取器,读取内容reader = tf.FixedLengthRecordReader(self.bytes)key,value = reader.read(file_queue)# 3、文件内容解码image_label = tf.decode_raw(value,tf.uint8)# 分割标签与图像张量,转换成相应的格式label = tf.cast(tf.slice(image_label,[0],[self.label_bytes]),tf.int32)image = tf.slice(image_label,[self.label_bytes],[self.image_bytes])print(image)# 给image设置形状,防止批处理出错image_tensor = tf.reshape(image,[self.height,self.width,self.depth])print(image_tensor.eval())# depth_major = tf.reshape(image, [self.depth,self.height, self.width])# image_tensor = tf.transpose(depth_major, [1, 2, 0])# 4、处理流程image_batch,label_batch = tf.train.batch([image_tensor,label],batch_size=10,num_threads=1,capacity=10)return image_batch,label_batchdef convert_to_tfrecords(self,image_batch,label_batch):"""转换成TFRecords文件:param image_batch: 图片数据Tensor:param label_batch: 标签数据Tensor:param sess: 会话:return: None"""# 创建一个TFRecord存储器writer = tf.python_io.TFRecordWriter(FLAGS.records_file)# 构造每个样本的Examplefor i in range(10):print("---------")image = image_batch[i]# 将单个图片张量转换为字符串,以可以存进二进制文件image_string = image.eval().tostring()# 使用eval需要注意的是,必须存在会话上下文环境label = int(label_batch[i].eval()[0])# 构造协议块example = tf.train.Example(features=tf.train.Features(feature={"image": tf.train.Feature(bytes_list=tf.train.BytesList(value=[image_string])),"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))}))# 写进文件writer.write(example.SerializeToString())writer.close()return Nonedef read_from_tfrecords(self):"""读取tfrecords:return: None"""file_queue = tf.train.string_input_producer(["./cifar10/cifar.tfrecords"])reader = tf.TFRecordReader()key, value = reader.read(file_queue)features = tf.parse_single_example(value, features={"image":tf.FixedLenFeature([], tf.string),"label":tf.FixedLenFeature([], tf.int64),})image = tf.decode_raw(features["image"], tf.uint8)# 设置静态形状,可用于转换动态形状image.set_shape([self.image_bytes])print(image)image_tensor = tf.reshape(image,[self.height,self.width,self.depth])print(image_tensor)label = tf.cast(features["label"], tf.int32)print(label)image_batch, label_batch = tf.train.batch([image_tensor, label],batch_size=10,num_threads=1,capacity=10)print(image_batch)print(label_batch)with tf.Session() as sess:coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess,coord=coord)print(sess.run([image_batch, label_batch]))coord.request_stop()coord.join(threads)return Noneif __name__=="__main__":# 构造文件名字的列表filename = os.listdir(FLAGS.data_dir)file_list = [os.path.join(FLAGS.data_dir, file) for file in filename if file[-3:] == "bin"]cfar = CifarRead(file_list)# image_batch,label_batch = cfar.readcifar_decode()cfar.read_from_tfrecords()with tf.Session() as sess:# 构建线程协调器coord = tf.train.Coordinator()# 开启线程threads = tf.train.start_queue_runners(sess=sess, coord=coord)# print(sess.run(image_batch))# 存进文件# cfar.convert_to_tfrecords(image_batch, label_batch)coord.request_stop()coord.join(threads)





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于使用ModelSim中编写testbench模板问题

对于初学者来说写Testbench测试文件还是比较困难的,但Modelsim和quartus ii都提供了模板,下面就如何使用Modelsim提供的模板进行操作。 Modelsim提供了很多Testbench模板,我们直接拿过来用可以减少工作量。对源文件编译完后,鼠标光…

LeetCode 1673. 找出最具竞争力的子序列(单调栈)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列。 数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。 在子序列 a 和子序列 b 第一个不相同的位置上&am…

android获取string.xml的值

为什么需要把应用中出现的文字单独存放在string.xml文件中呢? 一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再…

牛客 怕npy的牛牛(双指针)

文章目录1. 题目2. 解题1. 题目 链接:https://ac.nowcoder.com/acm/contest/9556/B 来源:牛客网 题目描述 牛牛非常怕他的女朋友,怕到了走火入魔的程度,以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。 现在…

Flask入门之上传文件到本地服务器

Flask入门之上传文件到服务器今天要做一个简单的页面,可以实现将文件 上传到服务器(保存在指定文件夹)#Sample.py1 # coding:utf-82 3 from flask import Flask,render_template,request,redirect,url_for4 from werkzeug.utils import secur…

对象的三种状态

来自为知笔记(Wiz)转载于:https://www.cnblogs.com/zmpandzmp/p/3649196.html

Cygwin中如何像在Ubuntu中一样安装软件

cygwin作为windows下模拟Linux环境的的工具,使得我们能在windows下非常方便的使用Linux的命令和工具,下面讲讲怎样在cygwin添加不支持的命令。 1.首先安装cygwin:我们可以到Cygwin的官方网站下载Cygwin的安装程序,地址是&#xff…

LeetCode 321. 拼接最大数(单调栈)*

文章目录1. 题目2. 解题1. 题目 给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。 现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对…

pandas数据分析选则接近数值的最接优方案

import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE (720, 750) CHIDL_STOOL (300, 350) CHILD_PLAY_LEN (300, 400) CHILD_TENT (1100, 1300) # 2.遍历循环&#xff0c;添加到列表中 sum_length_lst [] play_lst …

iOS开发者有价值的工具集

转载于&#xff1a;http://www.cocoachina.com/applenews/devnews/2014/0307/7936.html我一直比较推崇聪明地工作要远胜于刻苦地工作。使用正确的工具可以帮你更好地解决问题&#xff0c;直达目标。我们都遇见过一些功能非常强大但又价值不菲的工具&#xff0c;虽然价格贵点&am…

Python数据分析之pandas学习

Python中的pandas模块进行数据分析。 接下来pandas介绍中将学习到如下8块内容&#xff1a;1、数据结构简介&#xff1a;DataFrame和Series2、数据索引index3、利用pandas查询数据4、利用pandas的DataFrames进行统计分析5、利用pandas实现SQL操作6、利用pandas进行缺失值的处理7…

牛客 String II

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/B 来源&#xff1a;牛客网 给出一个仅包含小写字母的字符串s&#xff0c;你最多可以操作k次&#xff0c;使得任意一个小写字母变为与其相邻的小写字母&#xff08;ASCII码差值的绝对…

STM32的RTC万年历显示问题

博客整理后写出来的,有点乱,大家见谅! 想让串口输出万年历效果.每次秒刷新一次 结果是串口软件一直输出,看起来很难受 先讲一讲C代码的\r和\n的区别 \r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉 \n 是回车&#xff0b;换行 把光标 先移到 行首 然后换到下一…

牛客 牛牛做除法II

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/A 来源&#xff1a;牛客网 牛牛想知道在[0,n]范围中&#xff0c;选取一个最大的数x&#xff0c;满足x % a b&#xff0c;不过这个范围可能会很大&#xff0c;牛牛不知道该如何解决…

【原创】oracle的tpc-c测试及方法

大家好&#xff0c;很高兴来到博客园分享自己的所见所得。希望和大家多多交流&#xff0c;共同进步。 本文重点在于简介使用BenchmarkSQL对oracle进行tpcc的测试步骤&#xff0c;只是一个简单入门的过程。 开源测试工具&#xff1a;BenchmarkSQL。 平台&#xff1a;windows 之前…

牛客 Bang! Bang!(动态规划)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9715/C 来源&#xff1a;牛客网 音游狂热爱好者牛牛接到了一个新的任务&#xff0c;那就是给一张乐谱设计重音符。每当玩家敲击重音符的时候就会发出"bang"的美妙声音!! 每一…

Andorid 反编译App

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/23564065 开发的过程中&#xff0c;有时候可能会去使用别的app里面的图片&#xff0c;参考布局甚至代码等&#xff0c;但是一般的.apk都是经过代码混淆的&#xff0c;这里分享下使用一些工具进行…

Ubuntu Linux系统下搭建自己的Web服务器

经常被拿来当服务器的有CentOS、Ubuntu......考虑到自己只有Ubuntu的镜像并且只是自己做一些简单的测试使用&#xff0c;所以选择的版本是Ubuntu 14.04 LTS。在这个平台上搭建自己的Web服务器。 相比在Windows下的wamp集成环境&#xff0c;Linux系统下同样有LAMP&#xff0c;不…

天池 在线编程 安排面试城市(贪心)

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/210874425247820050/215397455965131520 今天有N个面试者需要面试&#xff0c;公司安排了两个面试的城市A和B&#xff0c;每一个面试者都有到A城市的开销costA和到B城市的开销costB。 公司需要…

天池 在线编程 捡胡萝卜(模拟)

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/210874425247820050/215397455965131519 给定一个n * m 的矩阵 carrot, carrot[i][j] 表示(i, j) 坐标上的胡萝卜数量。 从矩阵的中心点出发&#xff0c;每一次移动都朝着四个方向中胡萝卜数量…