#*tf.train.string_input_producer(string_tensor, ,shuffle=True) 将输出字符串(例如文件名)输入到管道队列 string_tensor 含有文件名的1阶张量 num_epochs:过几遍数据,默认无限过数据 return:具有输出字符串的队列 *#
*class tf.TextLineReader 阅读文本文件逗号分隔值(CSV)格式,默认按行读取 return:读取器实例 tf.FixedLengthRecordReader(record_bytes) 要读取每个记录是固定数量字节的二进制文件 record_bytes:整型,指定每次读取的字节数 return:读取器实例 tf.TFRecordReader 读取TfRecords文件 *
*由于从文件中读取的是字符串,需要函数去解析这些字符串到张量 tf.decode_csv(records,record_defaults=None,field_delim = None,name = None) 将CSV转换为张量,与tf.TextLineReader搭配使用 records:tensor型字符串,每个字符串是csv中的记录行 field_delim:默认分割符”,” record_defaults:参数决定了所得张量的类型,并设置一个值在输入字符串中缺少使用默认值,如 tf.decode_raw(bytes,out_type,little_endian = None,name = None) 将字节转换为一个数字向量表示,字节为一字符串类型的张量,与函数tf.FixedLengthRecordReader搭配使用,二进制读取为uint8格式 *
tf.train.batch(tensors,batch_size,num_threads = 1,capacity = 32,name=None) 读取指定大小(个数)的张量 tensors:可以是包含张量的列表 batch_size:从队列中读取的批处理大小 num_threads:进入队列的线程数 capacity:整数,队列中元素的最大数量 return:tensors tf.train.shuffle_batch(tensors,batch_size,capacity,min_after_dequeue, num_threads=1,) 乱序读取指定大小(个数)的张量 min_after_dequeue:留下队列里的张量个数,能够保持随机打乱
tf.train.batch(tensors,batch_size,num_threads = 1,capacity = 32,name=None) 读取指定大小(个数)的张量 tensors:可以是包含张量的列表 batch_size:从队列中读取的批处理大小 num_threads:进入队列的线程数 capacity:整数,队列中元素的最大数量 return:tensors tf.train.shuffle_batch(tensors,batch_size,capacity,min_after_dequeue, num_threads=1,) 乱序读取指定大小(个数)的张量 min_after_dequeue:留下队列里的张量个数,能够保持随机打乱
构造文件队列的时候需要传入的参数是list,文件路径+文件名字os.listdir("./")找到某路径下所有文件,用file_name接受。
构造文件路径+文件名字,[os.path.join("./", file) for file in file_name],返回file_list
file_list传入文件构造队列
创建csv阅读器,reader = tf.TextLineReader()
从文件队列中读取文件,返回key和valuekey, value =reader.read(file_queue)
读取到的value现在还不是张量我们要对他进行解码decode,
`records = [["None"], [1]] # 读取的文件有两列,那么就是这样,如果默认第一列是字符串, 可以默认None,第二个默认是数字,可以默认int example, label = tf.decode_csv(value, record_defaults=records)`现在默认是读取一个样本的,想要去训练数据一个样本肯定是不够的,所以我们需要开启批处理,example_batch, label_batch = tf.train.batch([example, label], batch_size=9, num_threads=1, capacity=9),返回的是两个列表
在会话里我们开启读取文件的线程
import os import tensorflow as tf def csvread(file_list): """ 读取csv文件 :param filelist: :return:None """ # 构造文件队列 file_queue = tf.train.string_input_producer(file_list) # 构造阅读器读取队列 reader = tf.TextLineReader() # 读取文件 key, value = reader.read(file_queue) # 对每行内容进行解码 # record_defaults指定每个样本的每一列的类型,还可以指定默认值 records = [["None"], [1]] # 读取的文件有两列,那么就是这样,如果默认第一列是字符串,可以默认None,第二个默认是数字,可以默认int example, label = tf.decode_csv(value, record_defaults=records) # 想要读取多个数据就要批处理 example_batch, label_batch = tf.train.batch([example, label], batch_size=9, num_threads=1, capacity=9) return example_batch, label_batch if __name__ == "__main__": # 找到文件,放入列表,路径+名字放到列表当中 file_name = os.listdir("./") file_list = [os.path.join("./", file) for file in file_name] example_batch, label_batch = csvread(file_list) # 开启会话运行结果 with tf.Session() as sess: # 以下都是固定写法 # 定义一个线程协调器 coord = tf.train.Coordinator() # 开启读取文件的线程 threads = tf.train.start_queue_runners(sess, coord=coord) # 打印读取的内容 print(sess.run([example_batch, label_batch])) # 回收子线程 coord.request_stop() coord.join(threads)author: specyue@mail.ustc.edu.cn 欢迎交流