tensorflow內存溢出問題


Tensorflow的靜態圖結構簡潔清晰,符合人的思維。雖然編程上略微有些復雜,但是原理很容易看懂。

Tensorflow分建圖過程和運行圖(張量求值)兩個階段,在這兩個階段中都可以定義操作和張量。但是有一個非常容易犯的錯誤:把操作定義在循環里面。

例如下面這個例子,tf.assign操作放在了循環里面。

import tensorflow as tf

x = tf.Variable(1.0, dtype=tf.float32)

with tf.Session()as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(int(5)):
        ass = tf.assign(x, 2.0)
        sess.run(ass)
        del ass  # del操作不會刪除ass這個操作結點,只是刪除了內存中的引用
        print(tf.get_default_graph().get_operations())#查看圖中的所有操作
print(tf.get_default_graph().get_operations())#session結束了但是session中開辟的變量也沒有回收

在此例中,大量的“操作結點”被添加到圖中,打開任務管理器查找python進程,可以發現內存一直在漲,原因就在於申請了大量的“tf.add”操作結點卻無法釋放。

這個問題如何避免呢?只需要把操作結點的定義放在循環外面就可以了。

舉一個錯誤的例子,我們在計算accuracy時,如果把accuracy的操作結點定義在循環內部,那么隨着訓練批次的不斷增加,會產生大量的操作結點,訓練一段時間之后,內存就溢出了。


免責聲明!

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



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