線程隊列與IO操作
記錄,成為更好的自己
1. 隊列和線程
2. 文件讀取
3. 圖片處理
2. 文件讀取
1. 文件讀取流程
- 構(gòu)造一個文件隊列,把路徑+文件放入隊列中
- 讀取隊列內(nèi)容十厢,不同的文件有不同的讀取方式蜡豹。
- csv文件:默認讀取一行
- 二進制文件:指定一個樣本的bytes
- 圖片文件:按一張一張的讀取
- 解碼,讀取一個樣本的內(nèi)容
- 批處理
2. 文件讀取API
-
構(gòu)造文件隊列
- tf.train.string_input_producer(string_tensor, shuffle=True)
- 將輸出字符串(例如文件名)輸入到管道隊列
- string_tensor:含有文件名的1階張量(就相當于是一個列表慧脱,里面放的是每個文件的名字,注意要加路徑)
- shuffle:讀取的時候亂不亂贺喝,亂也沒有關系
- num_epochs:過幾遍數(shù)據(jù)菱鸥,默認無限過數(shù)據(jù)
- return:具有輸出字符串的隊列
-
文件閱讀器
根據(jù)文件格式,選擇相應的文件閱讀器
- class tf.TestLineReader
- 閱讀文本文件逗號分隔值(CSV)格式躏鱼,默認按行讀取
- return:讀取器實例
- tf.FixedLengthRecordReader(record_bytes)
- 要讀取每個記錄是固定數(shù)量字節(jié)二進制文件氮采,每個樣本占多少個自己去讀取。
- record_bytes:整型染苛,指定每次讀取的字節(jié)數(shù)
- return:讀取器實例
- tf.TFRecordReader
- 讀取TfRecords文件
有一個共同的讀取方法:
- read(file_queue):從隊列中指定數(shù)量內(nèi)容鹊漠,返回一個Tensors元祖(key文件名主到,value默認的內(nèi)容(行,字節(jié)))
- class tf.TestLineReader
-
文件內(nèi)容解碼器
從文件中讀取的是字符串躯概,需要函數(shù)去解析這些字符串到張量
- tf.decode_csv(records, record_defaults=None, field_delim=None, name=None)
將CSV轉(zhuǎn)換為張量登钥,與tf.TextLineReader搭配使用- records:tensor型字符串,每個字符串是CSV中的記錄行娶靡,就是剛剛讀出來的value
- field_delim:默認分割符“牧牢,”
- record_defaults:參數(shù)決定了所得張量的類型,并設置一個值在輸入字符串中缺少使用默認值姿锭。如:
- tf.decode_raw(bytes, out_type,little_endian=None,name=None)
- 將字節(jié)裝換為一個數(shù)字向量表示塔鳍,字節(jié)為一個字符串類型的張量,與函數(shù)tf.FixedLengthRecordReader搭配使用呻此,二進制讀取為uint8格式
- tf.decode_csv(records, record_defaults=None, field_delim=None, name=None)
- 開啟線程操作
- tf.train.start_queue_runners(sess=None,coord=None)
- 收集所有圖中的隊列線程轮纫,并啟動線程
- sess:所在的會話中
- coord:線程協(xié)調(diào)器
- return:返回所有線程隊列
- tf.train.start_queue_runners(sess=None,coord=None)
- 管道讀端批處理
- tf.train.batch(tensor,batch_size, num_threads=1,capacity=32,name=None)
- 讀取指定大小(個數(shù))的張量
- tensor:可以是包含張量的列表
- batch_size:從隊列中讀取的批處理大小
- num_threads:進入隊列的線程數(shù)
- capacity:整數(shù)趾诗,隊列中元素的最大數(shù)量
- return:tensors
- tf.train.batch(tensor,batch_size, num_threads=1,capacity=32,name=None)
文件讀取案例
CSV文件讀取
1. 先找到文件蜡感,構(gòu)造一個列表
2. 構(gòu)造文件隊列
3. 構(gòu)造閱讀器,讀取隊列內(nèi)容
4. 解碼內(nèi)容
5. 批處理(多個樣本)
```
def csvread(filelist):
"""
讀取CSV文件
:param filelist:文件路徑+名字的列表
:return: 讀取的內(nèi)容
"""
# 1. 構(gòu)造文件的列表
file_queue = tf.train.string_input_producer(filelist)
# 2. 構(gòu)造閱讀器
reader = tf.TextLineReader()
key ,value = reader.read(file_queue)
# print(value)
# 3. 對每行內(nèi)容進行解碼
# record_defaults:指定每一個樣本的每一列的類型恃泪,還可以指定默認值
records = [["None"],["None"]] #這里有兩列郑兴,指定兩個
example, label = tf.decode_csv(value, record_defaults=records)
# print(example, label)
# 4. 讀取多個數(shù)據(jù),進行批處理
# 批處理大斜春酢(batch_size)跟隊列情连,數(shù)據(jù)的數(shù)量沒有影響,只決定 這批次取多少數(shù)據(jù)
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__":
# 1. 找到文件览效,放入列表
file_name = os.listdir("./data/csvdata")
filelist = [os.path.join("./data/csvdata",file) for file in file_name]
# print(file_name)
example_batch, label_batch = csvread(filelist)
# 開啟會話
with tf.Session() as sess:
# 開啟線程協(xié)調(diào)器
coord = tf.train.Coordinator()
# 開啟讀取文件的線程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 打印讀取內(nèi)容
print(sess.run([example_batch, label_batch]))
# 回收子線程
coord.request_stop()
coord.join(threads)
```