tensorflow批量讀取數據


Tensorflow 數據讀取有三種方式:

Preloaded data: 預加載數據,在TensorFlow圖中定義常量或變量來保存所有數據(僅適用於數據量比較小的情況)。

Feeding: Python產生數據,再把數據喂給后端。TensorFlow程序運行的每一步, 讓Python代碼來供給數據。

Reading from file: 從文件中直接讀取,在TensorFlow圖的起始, 讓一個輸入管線從文件中讀取數據。

https://www.cnblogs.com/jyxbk/p/7773319.html
https://blog.csdn.net/XUEER88888888888888/article/details/86666614
https://www.cnblogs.com/zyly/p/8982335.html
https://blog.csdn.net/chenghtao/article/details/82110434
https://www.cnblogs.com/jyxbk/p/7773319.html
https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6NeXnRkLS7fcqFq8n02wCL9Pp37pjYjVUJBPmYRRn48s
https://blog.csdn.net/christianashannon/article/details/78966048

         對於數據量較小而言,可能一般選擇直接將數據加載進內存,然后再分batch輸入網絡進行訓練(tip:使用這種方法時,結合yield 使用更為簡潔,大家自己嘗試一下吧,我就不贅述了)。但是,如果數據量較大,這樣的方法就不適用了,因為太耗內存,所以這時最好使用tensorflow提供的隊列queue,也就是第二種方法 從文件讀取數據。對於一些特定的讀取,比如csv文件格式,官網有相關的描述,在這兒我介紹一種比較通用,高效的讀取方法(官網介紹的少),即使用tensorflow內定標准格式——TFRecords

    TensorFlow提供了一個隊列機制,通過多線程將讀取數據與計算數據分開。因為在處理海量數據集的訓練時,無法把數據集一次全部載入到內存中,需要一邊從硬盤中讀取,一邊進行訓練,為了加快訓練速度,我們可以采用多個線程讀取數據,一個線程消耗數據。(隊列:https://www.jianshu.com/p/d063804fb272)

TensorFlow里與Queue有關的概念和用法。

其實概念只有三個:

Queue是TF隊列和緩存機制的實現
QueueRunner是TF中對操作Queue的線程的封裝
Coordinator是TF中用來協調線程運行的工具

  1. Queue
    根據實現的方式不同,分成具體的幾種類型,例如:

tf.FIFOQueue 按入列順序出列的隊列
tf.RandomShuffleQueue 隨機順序出列的隊列
tf.PaddingFIFOQueue 以固定長度批量出列的隊列
tf.PriorityQueue 帶優先級出列的隊列
... ...

這些類型的Queue除了自身的性質不太一樣外,創建、使用的方法基本是相同的。
創建函數的參數:
tf.FIFOQueue(capacity, dtypes, shapes=None, names=None ...)

Queue主要包含入列(enqueue)和出列(dequeue)兩個操作。enqueue操作返回計算圖中的一個Operation節點,dequeue操作返回一個Tensor值。Tensor在創建時同樣只是一個定義(或稱為“聲明”),需要放在Session中運行才能獲得真正的數值。(詳細請參考:https://blog.csdn.net/fegang2002/article/details/82949863)下面是一個單獨使用Queue的例子:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

tf.InteractiveSession()

q = tf.FIFOQueue(2, "float")
init = q.enqueue_many(([0,0],))

x = q.dequeue()
y = x+1
q_inc = q.enqueue([y])

init.run()
q_inc.run()
q_inc.run()
q_inc.run()
x.eval() # 返回1
x.eval() # 返回2
x.eval() # 卡住

如果一次性入列超過Queue Size的數據,enqueue操作會卡住,直到有數據(被其他線程)從隊列取出。對一個已經取空的隊列使用dequeue操作也會卡住,直到有新的數據(從其他線程)寫入

  1. QueueRunner
    Tensorflow的計算主要在使用CPU/GPU和內存,而數據讀取涉及磁盤操作,速度遠低於前者操作。因此通常會使用多個線程讀取數據,然后使用一個線程消費數據。QueueRunner就是來管理這些讀寫隊列的線程的。
    QueueRunner需要與Queue一起使用(這名字已經注定了它和Queue脫不開干系),但並不一定必須使用Coordinator。看下面這個例子:

增加計數的進程會不停的后台運行,執行入隊的進程會先執行10次(因為隊列長度只有10),然后主線程開始消費數據,當一部分數據消費被后,入隊的進程又會開始執行。最終主線程消費完20個數據后停止,但其他線程繼續運行,程序不會結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM