神经网络基础 神经网络原理 手写数字识别案例 文件读取流程 多线程 + 队列 通用文件读取流程 构建文件名队列 读取与解码 批处理队列 手动开启线程 构建文件名队列 将需要读取的文
- 神经网络基础
- 文件读取流程
- 多线程 + 队列
- 通用文件读取流程
- 手动开启线程
- 将需要读取的文件名放到文件名队列
- tf.train.string_input_producer(string_tensor,shuffle=true)
- string_tensor:文件名+路径的一阶张量
- num_epochs:过几遍数据,默认路径无线过数据
- return:文件队列
- 从队列中读取文件内容,并进行解码
- tf.TextLineReder
- 阅读文本文件逗号分隔(CSV)格式,默认按行读取
- return:返回读取器实例
- 解码:tf.decode_csv:解码文件内容
- tf.WholeFileReader
- 读取图片文件
- return:读取器实例
- 解码1:tf.image.decode_jpg(contents)(将JPEG编码的图像解码为uint8张量)
- return:uint8张量,3-D形状[height,width,channels]
- 解码2:tf.image.decode_png(contents)(将png编码的图像解码成uint8张量)
- return:张量类型,3-D形状[height,width,channels]
- tf.FixedLengthRecordReader(record_bytes)
- 读取二进制文件,记录固定数量字节的二进制文件
- record_bytes:整型,指定每次读取(一个样本)的字节数
- return:阅读器实例
- 解码:td.decode_raw:解码二进制文件
- 与tf.FixedLengthRecordReader搭配使用,二进制读取为uint8类型,tf.cast()可以类型转换
- tf.TFReocrdReader
- 读取TFRecords文件
- return:读取器实例
- 它们有共同的读取方法:读取器.read(file_queue),并且返回一个Tensors元组(key文件名、value默认的内容(一个样本))
- 进行批处理需要使用tf.train.batch或tf.train.shuffle_batch进行批处理操作,便于指定每批读多个样本的训练
- tf.train.batch(tensor,batch_size,num_threads=1,capacity=32,name=None)
- 读取指定大小(个数)的张量
- tensor:可以时包含张量的列表,批处理的内容放到列表的当中
- batch_size:从队列中读取的批处理大小
- num_threads:进入队列的线程数
- capacity:整数,队列中元素的最大数量
- return:tensor
- tf.train.shuffle_batch
3.1.2线程操作
以上队列都是tf.QueueRunner对象,每个QueueRunner都负责一个阶段,tf.train.start_queue_runners函数要求在图中的每个QueueRunner启动它的运行队列操作的进程(在会话中开启)
- tf.train.start_queue_runners(sess=None,coord=None)
- sess:所在会话
- coord:线程协调器
- return:返回所有线程
- tf.train.Coordinator()
- 线程协调员,对线程进行管理和协调
- request_stop():请求停止
- should_stop():询问是否结束
- join(threads=None,stop_grace_period_secs=120):回收线程
- return:线程协调员实列
图像基本知识
- 特征抽取:
文本 - 数值(二维数组shape(n_sample,m_features))
字典 - 数值(二维数组shape(n_sample,m_features))
图片 - 数值(三位数组shape(图片长度、图片宽度、图片通道数)) - 图片三要素:
- 灰度图[长,宽,1]
- 每一个像素点[0,255]的一个数
- 彩色图片[长,宽,3]
- 每一个像素点用3个[0,255]的数表示
- 张量形状
Tensor(指令名称,shape,dtype)
- 一张图片shape=(height,width,channels)
- 多张图片shape=(batch,height,width,channels)在一张图片的基础上加上多少个
- 图片特征值处理
- 缩放到统一大小,每个特征数量保持相同,所以需要将所有图片的张量大小统一转换,减少计算开销
- tf.image.rasize_images(images,size)
- 缩小放大图片
- images:4-D形状[batch,height、width、channels]或3-D的张量[height、width、channels]的图片数据
- size:1-D int32张量:new_height,new_width,图像尺寸
- 返回4-D格式或3-D格式图片
数据存储
- 存储:uint8(节约空间)
- 矩阵计算:float32(提高精度)
图片读取案例
import tensorflow as tfimport os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def images_read(file_lists):
"""
读取dog图片
"""
# 1.构建文件名队列
file_queue = tf.train.string_input_producer(file_lists)
# 2.读取与解码
#读取器,读取阶段
reader = tf.WholeFileReader()
#key文件名,value一张图片原始编码格式
key, value = reader.read(file_queue)
image = tf.image.decode_jpeg(value)
#修改尺寸,必须确定形状
image_resized = tf.image.resize_images(image, [200, 200])
image_resized.set_shape(shape=[200, 200, 3])
print(image_resized)
# 3.批处理capacity队列容量
image_batch = tf.train.batch([image_resized], batch_size=70, num_threads=1, capacity=70)
with tf.Session() as sess:
#开启线程,不开线程将直接阻塞
#线程协调员
coords = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coords)
new_key, new_value, new_image, new_image_resized, new_image_batch= sess.run([key, value, image, image_resized, image_batch])
print(new_image)
print(new_image_resized)
print(new_image_batch)
#回收线程
coords.request_stop()
coords.join(threads)
return None
if __name__ == "__main__":
filename = os.listdir("./images")
file_lists = [os.path.join("./images/",files) for files in filename]
images_read(file_lists)