1、我們要處理的資料一般在檔案(,文件等)當中,讀取資料之後才能使用深度學習演算法進行訓練,tf提供了多種資料的讀取方式。
2、在計算需要快速進行的時候,如何提高i/o的速度?(即如何解決i/o和計算不平衡的問題)
在訓練的過程中,我們需要訓練的資料往往會非常的大,不可能執行一次性讀取的操作,不僅消耗記憶體,而且「計算」要花費更長的時間去等待「讀取」的完成才能繼續,tf提供了真正的多執行緒、佇列以及檔案的改善(tfrecords檔案格式)機制,可以並行的去執行多個任務,
tf讓子執行緒去讀取資料,這樣主線程就可以直接進行模型的訓練。子執行緒沒讀取到一定量的資料(如100個)之後,主線程進行模型的訓練。
3、佇列和執行緒
(1)佇列和佇列管理器
在訓練樣本的時候,希望讀入的訓練樣本時有序的
●tf.flfoqueue 先進先出佇列,按順序出佇列
api :fifoqueue(capacity, dtypes, name='
fifo_queue')
建立-乙個以先進先出的順序對元素進行排隊的佇列
● capacity:整數。佇列的大小,可能儲存在此佇列中的元素數量的上限,
● dtypes: dtype物件列表。長度dtypes必須等於每個佇列元素中的張量數, dtype的型別形狀,決定了後面進佇列元素形狀
method
● dequeue(name=none) #出佇列
● enqueue(vals, name=none): #進佇列
● enqueue_many(vals, name=none); #vals列表或者元組,把很多資料資料同時放進去,返回乙個進佇列操作
● size(name=none) #佇列當前的元素個數,常用於判斷
例:對佇列進行操作,佇列q中有三個資料,每取乙個資料,對資料進行+1操作,再把結果放入佇列
① 定義乙個佇列
q = tf.fifoqueue(3, tf.float32)
② 放入資料
enq_many = q.enqueue_many(vals = [[0.1,0.2,0.3]]) #enq,enter_queue進佇列
③出佇列,加1操作,進佇列
out_q =q.dequeue() #此時out_q是乙個tensor,可以run之後取出資料data = out_q + 1
#符號過載
en_q = q.enqueue(data)
依賴性,下乙個op和上乙個op之間必須存在計算的操作關係(如加一等),才能說他們擁有依賴性,此時只需執行最後乙個即可。這裡的data 和out_q存在計算的操作關係,而out_q和enq_many沒有關係
④ 會話
with tf.session() assess:
#初始化佇列
sess.run(enq_many)
for i in range(100
): sess.run(en_q)
for i in
range(q.size().eval()):
print(sess.run(q.dequeue()))
⑤ 錯誤顯示:
valueerror: shape () must h**e rank at least 1
原因:
enq_many = q.enqueue_many(vals = [0.1,0.2,0.3]) #vals 列表或者元組
[文件解釋]該操作沿著第0維將每個元件張量分割成多個佇列元素。「vals」中的所有張量必須在第0維中具有相同的大小。如果執行此操作時佇列已滿,則它將阻塞,直到所有元素都已排隊。
這裡應該是[[0.1,0.2,0.3],]才能將其的分量[0.1,0.2,0.3]切片,建立為佇列元素
⑥ 完整**
1import
tensorflow as tf
2import
os3 os.environ['
tf_cpp_min_log_level
'] = '2'
#去掉警告,將警告級別提公升45
#模擬一下同步先處理資料,然後才能取資料訓練6#
每乙個op需要在session中去執行7#
tf中,執行操作有依賴性(比如第二步)89
#1. 首先定義佇列
10 q = tf.fifoqueue(3, tf.float32) #
佇列的大小
11 enq_many = q.enqueue_many(vals = [[0.1,0.2,0.3],]) #
vals 列表或者元組, 該op返回乙個進佇列操作
1213
#2.定義一些讀取資料,取資料的過程, 取資料 ,+1, 入佇列
14 out_q = q.dequeue() #
此時out_q是乙個tensor,可以run之後取出資料
15 data = out_q + 1 #
符號過載
16 en_q =q.enqueue(data)17#
18#這裡的data 和out_q存在計算的操作關係,而out_q和enq_many沒有關係
1920
with tf.session() as sess:21#
初始化佇列
22sess.run(enq_many)23#
sess.graph()24#
處理資料,從佇列中取資料 (放資料)
25for i in range(100):
26 sess.run(en_q) #
執行依賴的最後乙個,這裡列印是沒有資料的
2728
#訓練資料 (這裡假設為取資料)
29for i in range(q.size().eval()): #
q.size()是乙個op,需要加eval()取值
30print(sess.run(q.dequeue()))
輸出:
33.233.3
34.1
● tf.randomshufflequeue 隨機出佇列
(2)執行緒和協調器
佇列(一) 佇列的陣列實現方式
1.佇列的概念 佇列是一種特殊的線性表,只允許在佇列的一端進行插入而在另一端進行刪除。佇列一般擁有隊首 front指標 和隊尾 rear指標 當乙個佇列並未存入資料的時候,front和rear指標均指向隊首。入隊的操作 rear後移,存入資料在rear指向的單元,隊滿不可入隊,這同時也表明front...
佇列(一) 佇列的陣列實現方式
1.佇列的概念 佇列是一種特殊的線性表,僅僅同意在佇列的一端進行插入而在還有一端進行刪除。佇列一般擁有隊首 front指標 和隊尾 rear指標 當乙個佇列並未存入資料的時候,front和rear指標均指向隊首。入隊的操作 rear後移,存入資料在rear指向的單元,隊滿不可入隊,這同一時候也表明f...
容器 一 佇列容器List
list容器介紹 相對於vector容器的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭代器失效,每次插入或刪除乙個元素就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list永遠是常數時間。區別與其他佇列容器 vector,l...