Tensorflow文件读取

tensorflow读取文件的特点

  1. 读取文件数据量特别大
  2. 需要在样本集中随机读取n个样本,每批次读取的对象不一样(随机,分批次)
  3. 需要读取的快(使用tensorflow的线程,不使用python的线程(全局解释器锁))

Tensorflow文件读取的步骤

  1. 将要读取的文件放入文件名队列中(因为用线程来读需要使用queue)
  2. 读取(线程读取)文件内容,并实行解码
  3. 批处理,按照指定数量构建一个批次取出

示例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()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值