2017-03-09 21 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への回答を見るような何かを行うことができますようtf.reset_default_graph()を呼び出すことができますいずれか-nodes-from-graph-or-reset-default-default-graph – putonspectacles

+1

グラフは、Python-landにのみ存在するPythonオブジェクトであり、TensorFlow Cランタイムは言語に依存しないため、それについては認識しません。 session.closeを見れば、Cランタイムに委託するだけです。tf_session.TF_CloseDeprecatedSession –

答えて

0

スパイダー内からTensorFlowプログラムを実行しているとき、私はセッションの閉鎖問題に走りました。 RNN細胞は残っているようで、同じ名前の新しい細胞を作り出そうとすると問題を引き起こすようです。これはおそらく、Spyderから実行すると、プログラムがSpyderからの「実行」を完了したとしても、cベースのTensorFlowセッションが正しく終了しないためです。新しいセッションを取得するためにSpyderを再起動する必要があります。 Spyderから実行すると、セルに "reuse = True"を設定するとこの問題が回避されます。しかし、これは、RNNセルを訓練するときに反復プログラミングで有効なモードのようには見えません。その場合、観察者が何が起こっているのかを知ることなく、予期しない結果や行動が起こる可能性があります。

7

閉じるセッションは、設計によってグラフをリセットしません。あなたは、グラフをリセットしたい場合は、この

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

IMHO 2番目の方法は、すべての反復で新しいグラフを作成します。これはあまりクリーンではなく、メモリ面では重要です。 – gizzmole

+0

はい、最初のアプローチと同じように、新しいグラフが作成されます。グラフをリセットしたり削除したりすることはありませんが、 'with'コンテキストが実行されるとグラフは参照されなくなるので、ガベージコレクションされるので、きれいです。 –

+0

'reset_default_graph()'は基本的にグラフを削除して再作成します。むしろグラフの操作スタックですが、基本的には同じものです。 –

関連する問題