使用基於隊列的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:操作的名稱(可選)。
返回:
一個字符串張量。