tensorflow读取csv文件---My way of AI 16

xiaoxiao2025-08-26  90

流程

构造一个文件队列读取文件内容,csv文件默认读取一行,图片默认读取一张,二进制文件默认读取指定byte解码decode批处理主线程去样本训练数据

构造队列API

#*tf.train.string_input_producer(string_tensor, ,shuffle=True) 将输出字符串(例如文件名)输入到管道队列 string_tensor 含有文件名的1阶张量 num_epochs:过几遍数据,默认无限过数据 return:具有输出字符串的队列 *#

根据文件类型选择对应的文件阅读器API

*class tf.TextLineReader 阅读文本文件逗号分隔值(CSV)格式,默认按行读取 return:读取器实例 tf.FixedLengthRecordReader(record_bytes) 要读取每个记录是固定数量字节的二进制文件 record_bytes:整型,指定每次读取的字节数 return:读取器实例 tf.TFRecordReader 读取TfRecords文件 *

文件内容解码器API

*由于从文件中读取的是字符串,需要函数去解析这些字符串到张量 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 欢迎交流

转载请注明原文地址: https://www.6miu.com/read-5035268.html

最新回复(0)