数据IO操作:
三种文件读取方法:
一、通用文件读取流程(图片、二进制数据、TFRecords)
二、占位符&feed_dict搭配使用
三、QueueRunner(多线程+队列)
这里讲第三种,以读取图片为例
文件读取流程:
- 构造文件名队列
file_queue=tf.train.string.input_producer(string_tensor,shufile=True)
- 读取与解码
tf.TextLineReader() //文本读取 tf.decode_csv() //解码 tf.WholeFileReader()//读取图片 tf.image.decode_jpg(contents) //解码 tf.image.decode_png(contents) tf.FixedLengthRecordReader(record_bytes)//读取二进制文件 tf.decode_raw() tf.TFRecordReader //读取TFRecords文件
key,value=读取器.read(file_queue) 其中key文件名,value一个样本
- 批处理队列
tf.train.batch(tensor,batch_size,num_threads=1,capacity=32,name=None)
手动开启线程
tf.train.QueueRunner()
开启会话:
tf.train.start_queue_runners(sess=None,coord=None)
图片数据
特征抽取:
文本-数值(二维数组shape(n_samples,m_features))
字典-数值(二维数组shape(n_samples,m_features))
图片-数值(三维数组shape(图片长度、宽度、通道数))
组成图片最基本的单位是像素
图片三要素:
灰度图【长、宽、1】 每个像素点【0,255】的数
彩色图【长,宽,3】每个像素点用3个【0,255】的数
张量形状:
Tensor(指令名称,shape,dtype)
一张图片 shape=(height,width,channels)
多张图片 shape=(batch,height,width,channels)
缩放图片到统一大小:
tf.image.resize_images(image,size)
数据格式:
存储:uint8(节约空间)
矩阵运算:float32(提高精度)
案例:狗图片读取
1)构造文件名队列
2)读取与解码
使样本的形状和类型统一
3)批处理
代码:
import tensorflow as tf
import os
def picture_read(file_list):
'''
狗图片读取案例
'''
#1、构造文件名队列
file_queue=tf.train.string_input_producer(file_list)
# print(file_queue)
#2、读取与解码
#读取阶段
reader=tf.WholeFileReader()
#key文件名,value一张图片的原始编码形式
key,value=reader.read(file_queue)
print("key:\n",key)
print("value:\n",value)
#解码阶段
image=tf.image.decode_jpeg(value)
print("image:\n",image)
#图像的形状、类型修改
image_resized=tf.image.resize_images(image,[200,200])
#静态形状的修改
image_resized.set_shape(shape=[200,200,3])
print("image_resized:]n",image_resized)
#3、批处理(未经过图像形状、类型修改,批处理会报错)
image_batch=tf.train.batch([image_resized],batch_size=100,num_threads=1,capacity=100)
print("image_batch:\n",image_batch)
#开启会话(光开启会话会阻塞,需要开启线程)
with tf.Session() as sess:
#开启线程
#线程协调员
coord=tf.train.Coordinator()
threads=tf.train.start_queue_runners(sess=sess,coord=coord)
key_new,value_new,image_new,image_resized_new,image_batch_new=sess.run([key,value,image,image_resized,image_batch])
print("key_new:\n",key_new)
print("value_new:\n",value_new)
print("image_new:\n",image_new)
print('image_resized_new:\n',image_resized_new)
print("image_batch_new:\n",image_batch_new)
#回收线程
coord.request_stop()
coord.join(threads)
return None
if __name__=="__main__":
#构造路径+文件名列表
filename=os.listdir("./dog")
# print(filename)
#拼接路径+文件名
file_list=[os.path.join("./dog/",file) for file in filename]
# print(file_list)
picture_read(file_list)
图片数据链接:链接:https://pan.baidu.com/s/1w50KYjjVeR07v_g60fYJBg
提取码:1vit