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的操作結點定義在循環內部,那么隨着訓練批次的不斷增加,會產生大量的操作結點,訓練一段時間之后,內存就溢出了。
