2016-06-25 5 views
1

トレーニングを受ける前に、まずネットワークをプリトレーニングする必要があります。私は独自のセッションで別々のファイルでコードを使用していますが、最初のセッションの変数は引き継がれて問題を引き起こしています(これらのファイルを両方とも 'メイン'ファイル内で実行しているため)。Tensorflow:変数のスコープを与える方法

トレーニングされたレイヤーを保存している私のプリトレインファイルを実行して、保存したレイヤーをロードするトレーニングファイルを実行するだけで、この問題を回避できます。しかし、これらの2つのことをワンステップ。どのように私は 'リンクを壊すことができ、グローバルスコープの不要な変数を避けることができますか?

「メイン」ファイルは次のようなものになります。私が集まるところでは

from util import pretrain_nn 
from NN import Network 

shape = [...] 
layer_save_file = '' 
data = get_data() 

# Trains and saves layers 
pretrain_nn(shape, data, layer_save_file) 

# If I were to print all variables (using tf.all_variables) 
# variables only used in pretrain_nn show up 
# (the printing would be done inside `Network`) 
NN = Network(shape, pretrain=True, layer_save_file) 

NN.train(data) 

# Doesn't work because apparently some variables haven't been initialized. 
NN.save() 
+1

、私の最初の反応は、「変数が別のスクリプトに現れている」あなたはから 'やっていると仮定するだろうしますプリトレインインポート*。 –

+0

サンプルコードを追加しましたが、どの点を作成しようとしているのか分かりません。 '*'はすべてのモジュールをインポートしますが、関数内のpython変数とは関係ありません。 – Nimitz14

+1

私が言ったように、コードを見ることなく、盲目的な推測でした。私が作ろうとしていたのは、 "** GLOBAL_COUNTER **"が_util_の変数であれば、 "from util import *"は "** GLOBAL_COUNTER **"を_main_file.py_にインポートすることでした。明らかに、それはここでは当てはまりません。サンプルを提供していただきありがとうございます。 –

答えて

1

変数の有効期間は暗黙的にTensorFlowグラフに関連付けられており、デフォルトでは両方の計算が同じ(グローバル)グラフに追加されます。あなたがスコープそれらを適切にsubcomputationsの周囲with tf.Graph().as_default():ブロックを使用することができます:コードスニペットがないと

with tf.Graph().as_default(): 
    # Trains and saves layers 
    pretrain_nn(shape, data, layer_save_file) 

with tf.Graph().as_default(): 
    NN = Network(shape, pretrain=True, layer_save_file) 

    NN.train(data) 

    NN.save() 
+0

グラフをリセットするだけでスコーピングを行うことはできますか?テンソルフローAPIには、そのように見える関数 'tf.Graph().__ init __()'がありますが、使用しようとするとuninitについてのエラーが発生します。値が使用されています。 (その利点は、コンテキストマネージャを追加することをいつも心配する必要はなく、私の 'pretrain_nn'関数と' Network'クラスの後ろに隠れてしまうことです) – Nimitz14

0

を、pretrain_nn(pretrain_nnとネットワークの間で共有されている)TF上の変数を初期化しています。 tf.variable_scope() from the documentationによると:

変数のスコープは、新しい変数を作成し、 事故によって作成したり、共有しないようにチェックを提供しながら、既に 作成されたものを共有することができます。

これは、2つのスコープを分離しておくのに役立つようです。

関連する問題