9 資料讀取(一) 佇列操作實現同步

2022-09-08 03:21:09 字數 3161 閱讀 2216

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() as

sess:

#初始化佇列

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]切片,建立為佇列元素

⑥ 完整**

1

import

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.2

33.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...