tensorflow读取文件的特点
- 读取文件数据量特别大
- 需要在样本集中随机读取n个样本,每批次读取的对象不一样(随机,分批次)
- 需要读取的快(使用tensorflow的线程,不使用python的线程(全局解释器锁))
Tensorflow文件读取的步骤
- 将要读取的文件放入文件名队列中(因为用线程来读需要使用queue)
- 读取(线程读取)文件内容,并实行解码
- 批处理,按照指定数量构建一个批次取出
示例1:csv文件读取
假设样本文件数据都放在当前目录下的test_data目录
import tensorflow as tf
import os
#批量读取文本数据,返回一组样本数据和标签数据
def csv_read(file_list):
#1. 将file_list构建成队列,该API由tensorflow提供
file_queue = tf.train.string_input_producer(file_list)
#2. 读取文件内容,并解码
#创建文件读取器
reader = tf.TextLineReader()
#从file_queue中读取文件,返回k(文件名称),v(值)
#这是一个典型的多线程模型,需要使用queue避免线程间打架
k,v = reader.reade(file_queue)
#解码
records = [['None'],['None']] #给出默认值,用于解码解不出来
example,label = tf.decode_csv(v, #值
record_defaults=records) #如果解码不出来(出问题了)的默认值
#3. 批处理,将数据分成指定大小的批次
exam_bat,label_bat = tf.train.batch([example,label], #数据
batch_size=9, #每批次读取的数量
num_threads=1,) #线程数
return exa,_bat,label_bat #返回批量读取出来的数据
if __name__ == '__main__':
#1.构建文件队列
dir_name = './test_data/'
file_names = os.listdir(dir_name) #列出所有文件
file_list = [] #python的变量
for f in file_names: #将完整的文件路径添加到file_list中
file_list.append(os.path.join(dir_name,f)
#调用csv_read(),批量读取file_list中文件,返回一组样本数据和标签数据
example,label = csv_read(file_list)
#执行
with tf.Session() as sess:
#定义一个线程协调器来管理线程:等待回收线程回收资源
coord = tf.train.Coordinator()
#创建一组线程干活
threads = tf.train.start_queue_runners(sess,
coord=coord) #指点线程协调器
#运行读取文件的op(这儿才真正执行)
print(sess.run([example,label]))
#回收线程
coord.request_stop() #请求线程停止
coord.join(threads) #等待线程结束回收资源
示例2:图片文件读取
假设样本文件数据都放在当前目录下的test_data_img目录
import tensorflow as tf
import os
import matplotlib.pyplot as plt
#读取图片
def img_read(file_list):
#1. 构建文件队列
file-queue = tf.train.string_input_producer(file_list)
#2.读取数据
#定义读取器,直接读取整个图片文件(csv是按行读)
reader = tf.WholeFileReader()
#读文件,返回k(name)和v(值)
k, v = reader.read(file_queue)
#解码,调用tf.image.decode_jped()
img = tf.image.decode_jpeg(v)
#调整图片大小
img_resized = tf.image.resize(img,
[200,200]) #设置图片大小200*200
#固定图片样本数据的格式(批处理对格式有要求)
img_resized.set_shape([200,200,3])
#3.批处理
img_bat = tf.train.batch([img_resized], #数据
batch_size=10, #每批次处理数据数
num_threads=1) #线程数
return img_bat #返回批处理数据
if __name__ == '__main__':
#1. 构建文件队列
dir_name = '../data/test_img/'
file_names = os.listdir(dir_name) #列出所有文件
file_list = []
for f in file_names:
#拼出完整文件路径,并添加到列表
file_list.append(os.path.join(dir_anme,f))
#批量读取file_list中指定文件,返回样本数据
imgs = img_read(file_list)
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess,coord=coord)
#在当前session下执行op,并用imgs接收图片数据
imgs = imgs.eval()
coord.request_stop()
coord.join(threads)
#可视化
plt.figure('ImgShow',facecolor='lightgray')
#创建子图,显示图片
for i in range(10):
plt.subplot(2,5,i+1) #创建2行5列共10个子图,用来显示图片,当样本数据中图片不够10张时再次读取图片数据,显示时显示重复的图片
plt.xticks([])
plt.yticks([])
plt.imshow(imgs[i].astype('int32')) #imgs数据为float型,使用astype转为int
plt.tight_layout() #紧凑显示
plt.show()