2017-03-09 69 views
5

當前圖形中可用節點的數量在每次迭代中都不斷增加。由於會議結束,這看起來很不直觀,所有資源都應該被釋放。 即使創建新會話,以前的節點仍然徘徊不前的原因是什麼? 這裏是我的代碼:張量流程中的關閉會話不會重置圖形

for i in range(3): 
    var = tf.Variable(0) 
    sess = tf.Session(config=tf.ConfigProto()) 
    with sess.as_default(): 
     tf.global_variables_initializer().run() 
     print(len(sess.graph._nodes_by_name.keys())) 
    sess.close() 

它輸出:

5 
10 
15 
+0

看到的答案,這樣http://stackoverflow.com/questions/33765336/remove -nodes-from-graph-or-reset-entire-default-graph – putonspectacles

+1

圖是僅存在於Python-land中的Python對象,而TensorFlow C運行庫因爲它與語言無關而不知道它。如果你看一下session.close,你可以看到它幾乎只是委託給C運行時tf_session.TF_CloseDeprecatedSession –

回答

0

我從內Spyder的運行TensorFlow程序時遇到了會話關閉的問題。 RNN小區似乎仍然存在,試圖創建同名的新小區似乎會造成問題。這可能是因爲從Spyder運行時,即使程序已經在Spyder中完成了「運行」,基於c的TensorFlow會話也不能正常關閉。 Spyder必須重新啓動以獲得新的會話。從Spyder內部運行時,在單元格上設置「reuse = True」可解決此問題。但是,在訓練RNN小區時,這似乎不像迭代編程中的有效模式。在這種情況下,如果觀察者不知道發生了什麼,可能會發生一些意想不到的結果/行爲。

7

關閉會話不會按設計重置圖形。如果您想重置圖形,您可以調用tf.reset_default_graph()這樣

for _ in range(3): 
    tf.reset_default_graph() 
    var = tf.Variable(0) 
    with tf.Session() as session: 
     session.run(tf.global_variables_initializer()) 
     print(len(session.graph._nodes_by_name.keys())) 

,或者你可以做這樣的事情

for _ in range(3): 
    with tf.Graph().as_default() as graph: 
     var = tf.Variable(0) 
     with tf.Session() as session: 
      session.run(tf.global_variables_initializer()) 
      print(len(graph._nodes_by_name.keys())) 
+0

恕我直言,第二種方法在每次迭代中創建一個新圖,這不是很乾淨,並且對內存而言可能很關鍵 – gizzmole

+0

是的,它會創建一個新圖,與第一種方法相同。它不會重置或刪除圖形,但由於'with'上下文執行後圖形不再被引用,它將被垃圾收集,因此它非常乾淨。 –

+0

在引擎蓋下,'reset_default_graph()'基本上會丟棄並重新創建圖形。或者說是圖表的操作堆棧,但它本質上是一回事。 –