Introduction
在訓練model時最重要的就是數據,數據通常儲存於文件當中,早期在機器學習章程,我們使用pandas
讀取數據
但在tensorflow中,提供的各種優化的方式來讀取數據
- 在計算爭分奪秒的時候,需要去提高IO讀取的速度?
- 計算(CPU)操作 相比 IO(硬碟讀取)操作 快非常多
- 如果利用IO操作將1G甚至2G文件一次讀取到記憶體中
- 內存消耗嚴重
- 一次性讀取後,在一次性訓練,嚴重影響效率
- 讀取的速度太慢,訓練的時間嚴重被延後
tensorflow優化文件讀取
- tensorflow提供多線程讀取的機制
- 在tensorflow當中的多線程是真正的多線程( 並行(非併發) 的執行任務)
- 提供隊列(Queue)機制
- 提供專屬的文件格式
- tfrecords(非一般文件格式csv或圖片格式png,jpeg等)
- 提高讀取速度
- 提高解析文件速度
- tfrecords(非一般文件格式csv或圖片格式png,jpeg等)
解決一次性讀取數據的問題
- 使用多線程開啟多任務:創建並開啟子線程讀取數據
- 適時的讀取數據並訓練模型:讀取100個數據,拿100個數據訓練模型,再讀取100個
- placeholder(佔位符)
- Queue(隊列)
Tensorflow隊列
- 其與python自帶的隊列庫使用方法大同小異
- 在訓練樣本時,希望讀入的訓練樣本是有序的
tf.FIFOQueue
:先進先出隊列,按順序出隊列tf.RandomShuffleQueue
:隨機出隊列
FIFOQueue
使用tf.FIFOQueue(capacity,dtypes,name="fifo_queue")
創建一個先進先出的順序對元素進行排隊的隊列
capacity
:整數,能儲存在此隊列中的元素數量的上限dtypes
:隊列存儲的數據類型name
:隊列的名字
method
dequeue(name=None)
- 返回一個出隊列操作
enqueue(vals,name=None)
- 返回一個入隊列操作
enqueue_many(vals,name=None)
- 多個數據同時入隊列
- vals列表或者元組
- 返回一個進隊列操作(op)
size(name=None)
- 返回當前隊列存放多少數據
利用隊列實現同步
同步就是傳統先放完數據,再去取數據訓練
完成一個數據出隊列+1後入隊列操作
1 | import tensorflow as tf |
- 在tensorflow當中,運行op是有依賴性的,也就是在運行最後一個操作(op)時,其會回溯到最原始的op將其執行,直到指定的op執行完畢為止
- 因此定義圖(graph)時要是有流程的依賴性,只要執行最後一個op即可
- 因
en_q
操作含有new_data
操作,且new_data
操作中又含有de_q
操作,因此只要運行en_q
前面的op都會一起執行
- 在傳入多個數據時應讓其認為是多個數據而非一個張量
- 使用
[[data1,data2,data3],]
來確保傳入的為三個數據(二維),而非[data1,data2,data3]
一個張量(一維) - 如表示元組(tuple)應為
(5,)
而非(5)
- 使用
Result
1 | 33.2 |