記錄,成為更好的自己io操作相對於cpu的計算來說,速度較慢。
現在要讀2g的檔案,一次性讀取資料,消耗記憶體。一次性進行訓練。關鍵的問題在於速度慢,訓練的模型都在等資料輸入到模型中。
佇列與佇列管理器
tensorflow佇列
在訓練樣本的時候,希望讀入的訓練樣本時讀取的資料是有序的
完成乙個出佇列、+1、入佇列操作(同步操作)
# 模擬一下同步,先處理資料,然後才能取資料
#tensorflow中,執行操作有依賴性
# 1. 首先定義佇列
q = tf.fifoqueue(3, tf.float32)
# 放一些資料
enq_many = q.enqueue_many([[0.1,0.2,0.3],])
# 2.定義一些處理資料的過程,取資料的過程,取資料,+1,入佇列
out_q = q.dequeue()
data = out_q + 1
en_q = q.enqueue(data)
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()))
分析:當資料量很大時,入隊操作從硬碟中讀取資料,放入記憶體中,主線程需要等待入隊操作完成,才能進行訓練。會話裡可以執行多個執行緒,實現非同步讀取。
佇列管理器
其實就是建立執行緒
實現非同步操作,通過佇列管理器來實現變數加1,入隊,主線程出佇列的操作。
# 模擬非同步,子執行緒存入,主線程讀取
# 1.定義乙個佇列
q = tf.fifoqueue(1000, tf.float32)
# 2.定義要做的事情,迴圈值+1,放入佇列
var = tf.variable(0.0)
# 實現乙個變數自增
data = tf.assign_add(var, tf.constant(1.0))
en_q = q.enqueue(data)
# 3. 定義佇列管理器op,指定多少個子執行緒,子執行緒該幹什麼事情
qr = tf.train.queuerunner(q, enqueue_ops=[en_q]*2)
# 初始化變數的op
init_op = tf.global_variables_initializer()
# 開啟會話
with tf.session() as sess:
# 初始化變數
sess.run(init_op)
# 真正開啟子執行緒
threads = qr.create_threads(sess, start=true)
# 主線程,不斷讀取資料訓練
for i in range(300):
print(sess.run(q.dequeue()))
執行後結果會有乙個這樣的錯誤:
tensorflow.python.framework.errors_impl.cancellederror: enqueue operation was cancelled
[[node: fifo_queue_enqueue = queueenqueuev2[tcomponents=[dt_float], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:cpu:0"](fifo_queue, assignadd)]]
分析:這時候有乙個問題就是,入隊自顧自的去執行,在需要的出隊操作完成之後,程式沒法結束。需要乙個實現執行緒間的同步,終止其他執行緒。
執行緒協調器
通過執行緒協調器來解決如上問題。主線程已經結束了,子執行緒還在做。
with tf.session() as sess:
# 初始化變數
sess.run(init_op)
# 開啟執行緒管理器
coord = tf.train.coordinator()
# 真正開啟子執行緒
threads = qr.create_threads(sess, coord=coord, start=true)
# 主線程,不斷讀取資料訓練
for i in range(300):
print(sess.run(q.dequeue()))
# **執行緒
coord.request_stop()
coord.join(threads)
執行緒佇列與IO操作(三)
記錄,成為更好的自己 影象基本知識 如何用張量來表達?指定3 d張量 height,weight,channels 如 200,200,3 200長200寬3通道。每乙個樣本必須保持特徵值數量一樣。影象讀取api 影象讀取器 影象解碼器 讀取 def picread filelist 讀取狗並轉換成...
Tensorflow 順序佇列與IO操作
cpu負責tensorflow的計算,io負責讀取檔案 由於速度上的差異,通常做法是 主線程進行模型訓練,子執行緒讀取資料,二者通過佇列進行資料傳輸 相當於主線程從佇列讀資料,子程序往佇列放資料 在使用tensorflow進行非同步計算時,佇列是一種強大的機制。乙個簡單的例子。先建立乙個 先入先出 ...
多執行緒下的IO操作
今天考慮優化專案中檔案操作,專案中有許多批量刪除檔案的操作,當檔案很多時,刪除操作會比較費時 1s 2s的時間也顯得有點慢了 更何況10s以上,想要通過多執行緒來同時處理多個檔案的刪除,在程式中使用了threadpool和parallel想要加速刪除,但是效果並沒有預期的明顯,總耗時甚至還有所提公升...