坑 之 tensorflow使用sess.run处理图片时越来越慢,占用内存越来越大的问题
最近在項目中需要使用tensorflow來對圖片進行離線預處理,但是使用sess.run時代碼越來越慢,最后幾分鐘才能處理一張圖片,這可怎么能行,我的數據集有數萬張圖片......
原始代碼
def process(img, .. , .. ,):.......return imgdef main():.......with tf.Session() as sess:for i in range(len(dataset)):img_op = process(...) #構圖動作img = sess.run(img_op).......if __name__ == "__main__":main()代碼在執行的過程中越來越慢,并且占用的內存空間越來越大,這就說明代碼本身是存在問題的。
我們知道,tensorflow在執行之前是要先構圖,然后再向圖中feed數據,正常來說,這兩個過程應該是分開進行的,但是由于我們在編寫代碼時的不規范,就容易在feed數據的過程在向計算圖中添加新的計算節點,你比如,我這里的img_op = process(.....)本身就是添加計算節點的動作,又叫做構圖動作,這些動作是非常危險的,不僅會影響運行速度,還會擴大計算圖的規模,占用過多的內存,有可能會導致程序崩潰。所以導致我代碼運行緩慢的原因是找到了,那么該怎么解決呢?
有兩種方案:1.將構圖動作移動到循環外。2.再循環里不斷變換當前的計算圖。
我們來分析以下兩種方法分別適合什么樣的場景:
1.將構圖動作移動到循環外。代碼如下:
使用標準的構圖方式建立一個計算圖,使用feed_dict喂入數據,那么聰明的你可能已經發現了一個問題,就是,如果我的圖片size大小不一怎么辦,沒辦法使用tf.placeholder來占位。沒錯,這種辦法由于是靜態計算圖的原因,只適用于固定輸入尺寸的處理任務,想要解決剛剛的問題只能使用第二種辦法。
2.再循環里不斷變換當前的計算圖。代碼如下:
這種辦法,我們發現,我們每次送入圖中的數據都可以是尺寸不一的,因為在處理每一個數據時都會創建新的計算圖,并且在處理結束后關閉當前計算圖。通過這樣的方式,我們就實現了代碼維護一個動態的計算圖,就避免了一開始計算圖越來越大所導致的種種問題。
兩種辦法所使用的場景不相同,重點是大家可以理解二者的區別究竟在哪里,并理解tensorflow的圖計算機制,來選擇適合自己工程的方式
總結
以上是生活随笔為你收集整理的坑 之 tensorflow使用sess.run处理图片时越来越慢,占用内存越来越大的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu系统靠谱的清理内存的方法(c
- 下一篇: 坑 之 使用numpy的tofile和f