2016-11-30 1 views
1

tf.Variableを使用してテンソルフローコードを実行できますが、tf.get_variableははるかに効率的です。上記のエラーは、次のコードによって生成されます。ValueError:変数の重みが存在しないか、tf.get_variable()で作成されていません。 VarScopeでreuse = Noneを設定することを意味しましたか?

w = tf.get_variable(name='weights', 
       shape=filter_shape, 
       initializer=tf.random_normal_initializer(0., 0.01)) 
    b = tf.get_variable(name='biases', 
         shape=filter_shape[-1], 
         initializer=tf.constant_initializer(0.)) 

この理由はわかりません。何か案は?

答えて

4

tf.get_variableは、変数の共有を有効にするために可変スコープで動作します。 how to share variablesの説明は次のとおりです。

具体的には、次のフレームワークを使用して変数の初期化と変数のフェッチを分離する傾向があります。

def initialize_variables(scope_name, shape): 
'''initialize variables within variable scope_name.''' 
    with tf.variable_scope(scope_name, reuse=None) as scope: 
     w = tf.get_variable("weight", shape, initializer = random_normal_initializer(0., 0.01))) 
     b = tf.get_variable("biase", shape[-1], initializer = tf.constant_initializer(0.0)) 
     scope.reuse_variables() 

def fetch_variables(scope_name): 
    '''fetch variables within variable scope_name''' 
    with tf.variable_scope(scope_name, reuse=True): 
     w = tf.get_variable("weight") 
     b = tf.get_variable("biase") 
     return w, b 

initialize_variables機能でreuse=None設定が与えられたinitializer設定に基づいてwb再作成を行いますので注意してください。 fetch_variablesでは、reuse=True設定で変数の共有が有効になります。

+0

私が書いたコードはスコープの中にあります。これらの変数を含むモデルを復元したい場合、これらの別々の関数を構築するか、fetch_variables関数だけを構築する必要がありますか?私が見ている例では、チェックポイントの復元と初期化がないためです。 – chrisrn

+0

私はチェックポイントの復元なしでこのコードを書きましたが、同じエラーが再び発生しています。 tf.Graph()。as_default()、tf.device( '/ cpu:0')を使用して、すべてのコードがこのスコープで記述されます。 global_step = tf.get_variable( \t \t \t \t 'global_step'、[]、 \t \t \t \t初期化子= tf.constant_initializer(0)、トレーニング可能= False)がありませんがあります:それは私はこのような世界的なステップを初期化するときので、奇妙なエラー。 – chrisrn

+0

変数を含むモデルを復元する場合は、fetch_variablesだけが必要です。 initialize_variablesを実行すると、変数の格納された値を上書きすることになります –

関連する問題