詳解tensorflow數據讀取機制
如何在tensorflow中創(chuàng)建上述的兩個隊列呢?
1.對于文件名隊列,我們使用tf.train.string_input_producer函數。這個函數需要傳入一個文件名list,系統(tǒng)會自動將它轉為一個文件名隊列.此外tf.train.string_input_producer還有兩個重要的參數,一個是num_epochs,它就是我們上文中提到的epoch數。另外一個就是shuffle.
2.在tensorflow中,內存隊列不需要我們自己建立,我們只需要使用reader對象從文件名隊列中讀取數據就可以了
3.在我們使用tf.train.string_input_producer創(chuàng)建文件名隊列后,整個系統(tǒng)其實還是處于“停滯狀態(tài)”的,也就是說,我們文件名并沒有真正被加入到隊列中。此時如果我們開始計算,因為內存隊列中什么也沒有,計算單元就會一直等待,導致整個系統(tǒng)被阻塞.而使用tf.train.start_queue_runners之后,才會啟動填充隊列的線程,這時系統(tǒng)就不再“停滯”。此后計算單元就可以拿到數據并進行計算,整個程序也就跑起來了,這就是函數tf.train.start_queue_runners的用處。

image
import tensorflow as tf
# 新建一個Session
with tf.Session() as sess:
# 我們要讀三幅圖片A.jpg, B.jpg, C.jpg
filename = ['A.jpg', 'B.jpg', 'C.jpg']
# string_input_producer會產生一個文件名隊列
filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)
# reader從文件名隊列中讀數據。對應的方法是reader.read
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
# tf.train.string_input_producer定義了一個epoch變量,要對它進行初始化
tf.local_variables_initializer().run()
# 使用start_queue_runners之后,才會開始填充隊列
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)