使用tensorflow進行程式設計時,經常遇到操作不當,帶來的記憶體洩露問題,這裡有乙個可以幫助debug問程式設計客棧題所在方法:
使用tf.graph.finalize()把運算圖變成唯讀的,從而對圖的修改都會報錯,從而找到記憶體洩露的定點。
目前我出現過記憶體洩露問題的有兩處:
1.session和graph沒有釋放記憶體。按照資料的說法,使用了with關鍵字可以在session異常退出時也釋放記憶體,否則要用session.close()關閉session。**如下:
w tf.session() as session:
#codes
#一般使用with以後就會釋放記憶體,否則執行如下釋放
session.close()
del session
另一方面,我是在session中載入graph(訓練好的模型),導致每次關閉程式再執行,graph出現重複載入的現象。錯誤**示例:
with tf.seesion() as session:
# 在session內部載入儲存好的g
s**er = tf.train.import_meta_graph('./cnn_cracks.meta')
s**er.restore(session, "./cnn_cracks")
# codes
此處,在一次執行session時會載入一次graph,一次執行的時候沒問題,但多次執行(除錯時),每次graph都會載入到記憶體而不被釋放,因而造成記憶體洩露。
正確的做法如下:
# 用with新建乙個graph,這樣在執行完以及異常退出時就會釋放記憶體
graph = tf.gragh()
with graph.as_default():
s**er = tf.train.import_meta_graph('./cnn_cracks.meta')
with tf.session(graph=graph) as session:
s**er.restore(session, "./cnn_cracks")
2.一些tensorflow的運算似乎也會修改圖,原因未明。所以在www.cppcns.com在訓練裡面把所有屬於tensorflow的運算都寫進去,執行session.run返回的只能是唯讀。
##錯誤**
#訓練graph = tf.graph()
with graph.as_default():
#codes
predict = tf.nn.softmax(model(data))
#**,這裡訓練檔案與**檔案是分離的
with tf.session(graph=graph) as session:
#codes
predict = session.run(predict, feed_dict=)
prediction = tf.argmax(predict, -1) #這裡會對圖進行修改
##正確**
#訓練graph = tf.graph()
with graph.as_default():
#codes
predict = tf.argmax(tf.nn.softmax(model(data)), -1)
#**with tf.session(graph=graph) as session:
#codes
prediction = session.run(predict, feed_dict=)
本文標題: 解決tensorflow 記憶體洩露問題
本文位址: /jiaoben/python/299565.html
使用 CrtSetDbgFlag檢測記憶體洩露
一 介紹 動態分配 記憶體是c c 程式語言乙個最強的特點,但是中國哲學家孫 sun tzu,我不知道是誰?那位知道?指出,最強的同時也是最弱的。這句話對c c 應用來說非常正確,在記憶體處理出錯的地方通常就是bugs產生的地方。乙個最敏感和難檢測的bug就是記憶體洩漏 沒有把前邊分配的記憶體成功釋...
STM SETIMAGE引起的gdi記憶體洩露
最近給程式加了乙個動畫功能後,發現程式會引起及其嚴重的記憶體洩露,找了半天發現是呼叫stm setimage引起的。素以在此將使用stm setimage遇到的問題記錄一下。我的程式將動畫的所有幀提前載入後用定時器迴圈用stm setimage把點陣圖控制代碼傳送到視窗顯示,發現沒顯示一次就洩露好幾...
使用memwatch跟蹤linux記憶體洩漏
參考 根據log可以查詢出申請了卻沒有釋放記憶體的行號。一 簡介 memwatch可以跟蹤程式中的記憶體洩漏和錯誤,能檢測雙重釋放 double free 錯誤釋放 erroneousfree 沒有釋放的記憶體 unfreed memory 溢位 overflow 下溢 underflow 等。解壓...