【Tensorflow】数据读取——文件读取流程(文本读取案例)

1、文件读取流程

2、文件读取API

3、文件读取案例

一、文件读取流程

步骤1:构造一个文件名队列(路径+文件名)

步骤2:读取文件名队列

步骤3:对读取的文件进行解码

步骤4:放入到样本队列中,进行批处理

注:

tensorflow默认只读取一个样本,根据样本格式不同,情况不同,如下:

1、csv文件   读取一行数据

2、二进制文件  指定一个样本的bytes读取

3、图片文件  一个文件一个文件的读取

批处理也是构造一个队列

主线程要做的事就是取样本数据训练

二、文件读取API

1、构造文件队列

tf.train.string_input_producer(string_tensor, num_epochs=None, shuffle=True)

将输出字符串(例如文件名)输入到管道队列

  • string_tensor:含有文件名+路径的1阶张量
  • num_epochs:   过几遍数据,默认无限过数据
  • return 文件队列

shuffleh指定是否顺序和乱序

2、文件阅读器

TensorFlow默认每次只读取一个样本,具体到文本文件读取一行、二进制文件读取指定字节数(最好一个样本)、图片文件默认读取一张图片、TFRecords默认读取一个example

  • tf.TextLineReader :
    • 阅读文本文件逗号分隔值(CSV)格式,  默认按行读取
    • return:读取器实例
  • tf.FixedLengthRecordReader: 二进制文件
    • 要读取每个记录是固定数量字节的二进制文件
    • record_bytes:整型,指定每次读取(一个样本)的字节数
    • return:读取器实例
  • tf.WholeFileReader:
    • 用于读取图片文件。
    • return:读取器实例
    • read(file_queue):输出是一个文件名(key)和该文件的内容(值)
  • tf.TFRecordReader:
    • 读取TFRecords文件

1、他们有共同的读取方法:read(file_queue):从队列中指定数量内容返回一个Tensors元组(key文件名字,value默认的内容(一个样本))

2、由于默认只会读取一个样本,所以通常想要进行批处理。使用tf.train.batch或tf.train.shuffle_batch进行多样本获取,便于训练时候指定每批次多个样本的训练

3、文件内容解码器

对于读取不同的文件类型,内容需要解码操作,解码成统一的Tensor格式

  • tf.decode_csv(records, record_defaults=None, field_delim=None, name=None):解码文本文件内容
    • 将csv文件转换为张量,与tf.TextLineReader搭配使用
    • records:tensor型字符串,每个字符串是csv中的记录行
    • field_delim:默认分隔符“,”
    • record_defaults:参数决定了所得张量的类型,并设置一个值。例如:[[1], ["None"]] 表示第一列为int,第二列为字符串
  • tf.decode_raw(bytes, put_type, little_endian=None, name=None):解码二进制文件内容
    • 将字节转换为一个数字向量表示,字节为一字符串类型的张量
    • 与tf.FixedLengthRecordReader搭配使用,二进制读取为uint8格式
  • tf.image.decode_jpeg(contents)
    • 将JPEG编码的图像解码为uint8张量
    • return:uint8张量,3-D形状[height, width, channels]
  • tf.image.decode_png(contents)
    • 将PNG编码的图像解码为uint8张量或unit16张量
    • return:张量类型,3-D形状[height, width, channels]

解码阶段,默认所有的内容都解码成tf.uint8格式,如果需要后续的类型处理继续处理

4、批处理

在解码之后,我们可以直接获取默认的一个样本内容了,但是如果想要获取多个样本,这个时候需要结合管道的末尾进行批处理

  • tf.train.batch(tensors, batch_size, num_threads = 1, capacity = 32, name=None)
    • 读取指定大小(个数)的张量
    • tensors:可以是包含张量的列表,  批处理的内容放到列表当中
    • batch_size:  从队列中读取的批处理大小
    • num_threads:进入队列的线程数
    • capacity:整数,队列中元素的最大数量
    • return: tensors

注意:

batch_size和capacity没有大小之分,谁大谁小都可以,一般相等就行
批处理大小跟队列大小和数据的数量没有关系。批处理大小只决定这批次取多少数据(若batch_size大于数据总量,则最后取出的数据有重复,而重复训练是没影响的)
capacity的大小不影响结果

  • tf.train.shuffle_batch(tensors, batch_size, capacity, min_after_dequeue, num_threads = 1, name=None)
    • 乱序读取指定大小(个数)的张量
    • min_after_dequeue:留下队列里的张量个数,能够保持随机打乱

开启线程操作

tf.train.start_queue_runners(sess=None, coord=None)

收集所有图中的队列线程,并启动线程

  • sess:所在的会话中
  • coord:线程协调器
  • return:返回所有线程队列

三、文件读取案例

csv文件数据展示:

完整代码如下:

#! /usr/bin/env python 
# -*- coding:utf-8 -*-
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'   # 设置告警级别

def csvread(filelist):
    """
    读取csv文件
    :param filelist: 文件路径+名字的列表
    :return: 读取的内容
    """
    # 1、构造文件队列
    file_queue = tf.train.string_input_producer(filelist)

    # 2、构造csv阅读器读取队列数据(按一行)
    reader = tf.TextLineReader()
    key, value = reader.read(file_queue)

    # 3、对每行内容解码
    # record_defaults:指定每一个样本的每一列的类型,指定默认值
    records = [["None"], ["None"]]
    # 有几列就用几个参数接收
    example, lable = tf.decode_csv(value, record_defaults=records)

    # 4、想要读取多个数据,就要进行批处理    9条数据,1个线程,指定队列9个数据
    # batch_size和capacity没有大小之分,谁大谁小都可以,一般相等就行
    # 批处理大小跟队列大小和数据的数量没有关系。批处理大小只决定这批次取多少数据(若batch_size大于数据总量,则最后的数据有重复,而重复训练是没影响的)
    # capacity的大小不影响结果
    example_batch, label_batch = tf.train.batch([example, lable], batch_size=9, num_threads=1, capacity=9)

    return example_batch, label_batch


if __name__ == '__main__':

    # 找到文件,放入列表
    file_name = os.listdir("./csvdata/")
    filelist = [os.path.join("./csvdata/", file) for file in file_name]

    example_batch, label_batch = csvread(filelist)

    # 开启会话运行结果
    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)

代码运行后如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值