1. 程式人生 > >Tensorflow-tf.FixedLengthRecordReader詳解

Tensorflow-tf.FixedLengthRecordReader詳解

Tensorflow-tf.FixedLengthRecordReader詳解

描述

tf.FixedLengthRecordReader是從一個檔案中輸出固定長度Recorder的類,是從ReaderBase繼承而來,ReaderBase是一個管理各種型別Reader(Reader資料讀取的類)的基類,它可以將字串(一般是一系列檔名)轉化為Records(每個Recorder是一個Key,Value對),Reader的每一步操作都會生成一個Record,這些Records都是從這些檔案內容裡提煉出來的。Reader可以通過Read()方法,從佇列Queue裡出列一條記錄Recorder,通過佇列可以進行解耦。Reader不相容eager execution。

初始化

init
建立一個FixedLengthRecordReader

__init__(
    record_bytes,
    header_bytes=None,
    footer_bytes=None,
    hop_bytes=None,
    name=None,
    encoding=None
)

引數

  • record_bytes: 整形數,輸出的Record的長度
  • header_bytes: 整形數,非必填,預設值為0
  • footer_bytes: 整形數,非必填,預設值為0
  • hop_bytes: 整形數,非必填,預設值為0
  • name: 設定操作的名稱,非必填
  • encoding: 檔案編碼的型別,預設為none。

屬性

  • reader_ref:Reader執行的操作
  • supports_serialize:是否支援序列化

方法

  • num_records_produced:
num_records_produced(name=None)

返回Reader生成的Recorders的個數,其實和Read()成功執行的次數相同
引數
name:操作的名稱,非必填。
返回
64位的整形張量

  • num_work_units_completed
num_work_units_completed(name=None)

返回Reader已經處理的work units(檔案)的數量
引數
name:操作的名稱,非必填。
返回
64位的整形張量

  • read
read(
    queue,
    name=None
)

返回Reader產生的Record(key,value對)
引數
queue:佇列或佇列控制代碼(可變的字串張量描述),佇列元素為字串
name:操作的名稱,非必填。

返回
具有(key,value對)的張量元組,key和value都是字串張量

  • read_up_to
read_up_to(
    queue,
    num_records,
    name=None
)

返回Reader產生的最多num_records個Record(key,value對),可以返回比num_records少的Record
引數
queue:佇列或佇列控制代碼(可變的字串張量描述),佇列元素為字串
num_records:Reader最多可以產生的Record數
name:操作的名稱,非必填。

返回
具有(key,value對)的張量元組,key和value都是字串張量

  • reset
reset(name=None)

恢復一個Reader的初始化狀態

引數
name:操作的名稱,非必填

返回
重置操作

  • restore_state
restore_state(
    state,
    name=None
)

恢復一個Reader到之前儲存的狀態,不是所有的Reader都支援這個操作,所以執行中可能會報錯。

引數
state:一個字串張量,
name:操作的名稱,非必填

返回
重置操作

  • serialize_state
serialize_state(name=None)

產生一個字串張量,標識Reader的序列化狀態。不是所有的Reader都支援這個操作,所以執行中可能會報錯。
引數
name:操作的名稱,非必填

返回
一個字串型別的張量

示例

設定tf.train.string_input_producer的引數shuffle=False

import tensorflow as tf

# 構造字串張量,包含要讀取的檔名
input_files=['inputs/input1.txt','inputs/input2.txt']
# 將input_files中包含的檔案打包生成一個先入先出佇列(FIFOQueue)
# 並且在計算圖的QUEUE_RUNNER集合中新增一個QueueRunner(QueueRunner包含一個佇列的一系列的入列操作)
# shuffle=True時,會對檔名進行亂序處理
input_queues=tf.train.string_input_producer(string_tensor=input_files,shuffle=False)

# 生成檔案閱讀器Reader,設定每次從檔案中讀取固定長度(4)的字串記錄Record
reader=tf.FixedLengthRecordReader(record_bytes=4)
# 檔案閱讀器讀取佇列的值返回key,value
key,value=reader.read(input_queues)

output_key=key
output_val=value

sess=tf.Session()
# 在運算圖中執行佇列操作
tf.train.start_queue_runners(sess=sess)

print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))

執行結果如下:

key: b'inputs/input1.txt:0'
key: b'inputs/input1.txt:1'
key: b'inputs/input1.txt:2'
key: b'inputs/input2.txt:0'
key: b'inputs/input2.txt:1'
key: b'inputs/input2.txt:2'
val: b'abcd'
val: b'efgh'
val: b'ijkl'
val: b'ABCD'
val: b'EFGH'
val: b'IJKL'

修改tf.train.string_input_producer的引數shuffle=True

import tensorflow as tf

# 構造字串張量,包含要讀取的檔名
input_files=['inputs/input1.txt','inputs/input2.txt']
# 將input_files中包含的檔案打包生成一個先入先出佇列(FIFOQueue)
# 並且在計算圖的QUEUE_RUNNER集合中新增一個QueueRunner(QueueRunner包含一個佇列的一系列的入列操作)
# shuffle=True時,會對檔名進行亂序處理
input_queues=tf.train.string_input_producer(string_tensor=input_files,shuffle=True)

# 生成檔案閱讀器Reader,設定每次從檔案中讀取固定長度(4)的字串記錄Record
reader=tf.FixedLengthRecordReader(record_bytes=4)
# 檔案閱讀器讀取佇列的值返回key,value
key,value=reader.read(input_queues)

output_key=key
output_val=value

sess=tf.Session()
# 在運算圖中執行佇列操作
tf.train.start_queue_runners(sess=sess)

print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('key:',sess.run(output_key))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))
print('val:',sess.run(output_val))

執行結果如下:

key: b'inputs/input2.txt:0'
key: b'inputs/input2.txt:1'
key: b'inputs/input2.txt:2'
key: b'inputs/input1.txt:0'
key: b'inputs/input1.txt:1'
key: b'inputs/input1.txt:2'
val: b'ABCD'
val: b'EFGH'
val: b'IJKL'
val: b'abcd'
val: b'efgh'
val: b'ijkl'

官網連結

https://tensorflow.google.cn/api_docs/python/tf/FixedLengthRecordReader