每天一個知識點(八)

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)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容