TensorFlow的數據讀取機制:(讀取圖片為例)
? ? ? 如果將圖片先讀取到內存中后提供給GPU或CPU計算,這樣GPU在數據讀取的時間是無事可做的,這大大降低運算效率。為此將讀取數據和計算分別放在兩個線程中去做。一個線程負責源源不斷的將圖片讀取到內存的一個隊列中,另一個線程直接從隊列中取用計算。
? ? ? 機器學習通常使用epoch來重復計算,運行一個epoch就是將數據集中的所有圖片都計算一遍,兩個epoch計算兩遍。為了方便管理epoch,TensorFlow在內存隊列前又添加了一個隊列叫做‘文件名隊列’。使用 tf.train.string_input_producer函數來創建文件名隊列,需要傳入一個文件名 list,系統會自動將它轉換成一個文件名隊列。此外還需要num_epoch(epoch的 數目)和shuffle(在文件名隊列中打亂圖片順序)兩個參數。在TensorFlow中不需要自己創建內存隊列,使用reader對象從文件名中讀取數據即可,如下所示。
reader = tf.WholeFileReader? key, value = reader.read(filename_queue)#filename_queue是文件名隊列。
? ? ? 一切準備就緒之后,咱們定義的文件名隊列中并沒有開始讀入圖片,需要使用tf.train.star_queue_runners函數進行激活。如下是讀取三張圖片的程序:
with tf.Session() as sess:
? ? filename = ['A.jpg', 'B.jpg', 'C.jpg']
? ? filename_queue = tf.train.string_input_producer(filename, huffle=false,num_epoch=5)
? ? reader = tf.WholeFileReader()
? ? key, value = reader.read(filename_queue)
? ? tf.local_variables_initializer().run()
? ? threads = tf.train.start_queue_runners(sess=sess)
? ? i = 0
? ? while True :
? ? i+=1
? ? image_data = sess.run(value)
? ? with open('read/test_%d.jpg'%i, 'wb') as f:
? ? f.write(image_data)