tensorflow随笔 -QueueRunner

版权声明:本博客所有文章版权归博主刘兴所有,转载请注意来源 https://blog.csdn.net/AI_LX/article/details/89465343

使用基于队列的api实现输入管道,属于数据API。
从文件中读取记录的典型基于队列的管道有以下几个阶段:

1.文件名列表
2.可选的文件名洗牌式重排
3.可选的epoch限制
4.文件名队列
5.文件格式的阅读器
6.一种×××,供读者阅读记录
7.可选的预处理
8.例子队列

文件名、变换和epoch限制

对于文件名列表,可以使用常量字符串张量(如[“file0”, “file1”]或[(“file%d” % i) For i in range(2)])或tf.train.match_filenames_once函数。

将文件名列表传递给tf.train.string_input_producer函数。string_input_producer创建一个FIFO队列,用于保存文件名,直到读者需要它们为止。

string_input_producer有一些选项,可以选择变换和设置最大的epoch数量。队列运行器为每个epoch向队列中添加完整的文件名列表,如果shuffle=True,则在epoch中对文件名进行洗牌式重排。这个过程提供了文件的统一采样,这样示例就不会彼此之间采样不足或过采样。

队列运行程序在一个与从队列中提取文件名的读取器分离的线程中工作,因此洗牌和排队过程不会阻塞读取器。

文件格式

选择与输入文件格式匹配的阅读器,并将文件名队列传递给阅读器的read方法。read方法输出一个标识文件和记录的键(如果有一些奇怪的记录,这对调试很有用)和一个标量字符串值。使用一个(或多个)×××和转换操作将这个字符串解码成构成示例的张量。

CSV文件

要读取逗号分隔值(CSV)格式的文本文件,请使用带有tf.decode_csv操作的tf.TextLineReader。例如:

filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"])

reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# Default values, in case of empty columns. Also specifies the type of the
# decoded result.
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(
    value, record_defaults=record_defaults)
features = tf.stack([col1, col2, col3, col4])

with tf.Session() as sess:
  # Start populating the filename queue.
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range(1200):
    # Retrieve a single instance:
    example, label = sess.run([features, col5])

  coord.request_stop()
  coord.join(threads)

每次执行read都会从文件中读取一行内容。然后,decode_csv op将结果解析为张量列表。record_defaults参数确定产生的张量的类型,如果输入字符串中缺少一个值,则设置要使用的默认值。

你必须调用tf.train.start_queue_runners填充队列,然后调用run或eval执行读取。否则,read在等待队列中的文件名时将阻塞。

要读取每个记录都是固定字节数的二进制文件,usetf.FixedLengthRecordReader与tf.decode_raw操作结合使用。decode_raw op从一个字符串转换为一个uint8张量。
例如,CIFAR-10数据集使用一种文件格式,其中每个记录使用固定字节表示:标签用1字节表示,图像数据用3072字节表示。一旦你有了一个uint8张量,标准的操作可以切下每一块,然后根据需要重新格式化。

类TextLineReader

继承自:ReaderBase

输出用换行符分隔的文件行的阅读器。

从输出中删除换行符。急切的兼容性

读者是不兼容的迫切执行。相反,请使用tf。将数据放入模型中。

属性

reader_ref

实现阅读器的操作。

supports_serialize

阅读器实现是否可以序列化其状态。

init

init(
skip_header_lines=None,
name=None
)

创建一个TextLineReader。

参数:

skip_header_lines:可选int.默认为0。每个文件开头要跳过的行数。
name:操作的名称(可选)。

num_records_produced(name=None)

返回此阅读器生成的记录的数量。

这与已成功执行的读执行次数相同。

参数:
name:操作的名称(可选)。
返回:

一个int64张量。

num_work_units_completed

num_work_units_completed(name=None)

返回此阅读器已完成处理的工作单元数。

参数:

name:操作的名称(可选)。
返回:

一个int64张量。

read

read(
queue,
name=None
)

返回阅读器生成的下一个record (key, value)(记录(键,值))对。

如果需要,将工作单元从队列中取出(例如,当读取器需要从一个新文件开始读取,因为它已经完成了前一个文件)。

参数:

queue: 表示队列句柄的队列或可变字符串张量,带有字符串工作项。
name: 操作的名称(可选)。

返回:

张量元组 (key, value)。key:一个字符串标量张量。key:一个字符串标量张量。

read_up_to

read_up_to(
queue,
num_records,
name=None
)

返回由阅读器生成的num_records (key, value)对。

如果需要,将工作单元从队列中取出(例如,当读取器需要从一个新文件开始读取时,因为它已经完成了前一个文件)。甚至在最后一批之前,它可能返回小于num_records的结果。

参数:

queue:表示队列句柄的队列或可变字符串张量,带有字符串工作项。
num_records:要读取的记录数量。

name: 操作的名称(可选)。
返回:

张量元组 (key, value)。key:一个字符串标量张量。key:一个字符串标量张量。

reset

reset(name=None)

将阅读器恢复到初始的清洁状态。

参数:

name:操作的名称(可选)。
返回:

创建操作。

restore_state

restore_state(
state,
name=None
)

将读取器恢复到先前保存的状态。

并不是所有的阅读器都支持被还原,因此这会产生一个未实现的错误。

参数:

state:字符串张量。匹配类型的阅读器的序列化状态的结果。
name:操作的名称(可选)。
返回:

创建操作。

serialize_state

serialize_state(name=None)

生成一个字符串张量来编码读取器的状态。

并不是所有的阅读器都支持序列化,因此这会产生未实现的错误。

参数:

name:操作的名称(可选)。
返回:
一个字符串张量。

猜你喜欢

转载自blog.csdn.net/AI_LX/article/details/89465343
今日推荐