1. 文件读取的一般流程
- 文件队列构造
- 文件阅读器
- 文件内容解码器
- 批处理
前3个步骤都是读取一个样本,第四步读取多个样本。
2. 每个步骤需要的API
读取数据中也用到线程的操作:
3. 文件读取案例
各种文本文件,这里使用的是txt文件,其他csv之类的都可以。
import tensorflow as tf
import os
main_path = "F:/文本文件数据/"
# 导入数据的准备
file_name = os.listdir(main_path)
print(file_name) # 以列表的形式列出文件的名字
# 完整路径
file_list = [os.path.join(main_path,file) for file in file_name] # join是连接字符串的方法,和“+”相同
# # 也可以这样写,意思一样只是“+”代替了join
# file_list1 = [main_path+x for x in os.listdir(main_path)]
# 1.构建文件的队列
file_queue = tf.train.string_input_producer(file_list)
# 2.构造阅读器读取队列数据
reader = tf.TextLineReader()
key , value = reader.read(file_queue)
# 3.对每一行内容进行解码
# record_defaults:指定每一个样本的每一列的类型,指定默认值
records = [["None"],["None"]] # 指定数据的两列都是字符串类型且默认值是None
example, label = tf.decode_csv(value,record_defaults=records) #样本有两列,所以有两个值接受
print(example,label)
# 开启会话
with tf.Session() as sess:
# 定义一个线程协调器
coord = tf.train.Coordinator()
#开启读文件的线程(这里比之前开启线程方便很多,有专门的的API)
threads = tf.train.start_queue_runners(sess, coord=coord)
print(sess.run([example,label]))
# 回收线程
coord.request_stop()
coord.join(threads)
结果:
需要注意 tf.decode_csv(value,record_defaults=records) 的record_defaults参数[[“None”],[“None”]]表示样本中的两列都是字符串,若有缺失值用None代替,若样本中的是数字可以这样 [[1],[2]],表示是int类型,第一列若有缺失值用1代替,第二列若有缺失值用2代替,其他类型类似。
因为,阅读器tf.TextLineReader()是默认按每一行读取,所以一次就读取一行,若想批量读取需要tf.train.batch()函数
代码:
import tensorflow as tf
import os
main_path = "F:/文本文件数据/"
# 导入数据的准备
file_name = os.listdir(main_path)
print(file_name) # 以列表的形式列出文件的名字
# 完整路径
file_list = [os.path.join(main_path,file) for file in file_name] # join是连接字符串的方法,和“+”相同
# # 也可以这样写,意思一样只是“+”代替了join
# file_list1 = [main_path+x for x in os.listdir(main_path)]
# 1.构建文件的队列
file_queue = tf.train.string_input_producer(file_list)
# 2.构造阅读器读取队列数据
reader = tf.TextLineReader()
key , value = reader.read(file_queue)
# 3.对每一行内容进行解码
# record_defaults:指定每一个样本的每一列的类型,指定默认值
records = [["None"],["None"]] # 指定数据的两列都是字符串类型且默认值是None
example, label = tf.decode_csv(value,record_defaults=records) #样本有两列,所以有两个值接受
print(example,label)
# 4.想要读取多个数据
example_batch, label_batch = tf.train.batch([example, label], batch_size=9,num_threads=1, capacity=9)
print(example_batch,label_batch)
# 开启会话
with tf.Session() as sess:
# 定义一个线程协调器
coord = tf.train.Coordinator()
#开启读文件的线程(这里比之前开启线程方便很多,有专门的的API)
threads = tf.train.start_queue_runners(sess, coord=coord)
print(sess.run([example_batch,label_batch]))
# 回收线程
coord.request_stop()
coord.join(threads)
结果