2016-05-09 5 views
1

から初期化tf.variable_scope(名)内の変数を、作成tensorflowコミュニティ、ちょっと別の変数のinitialized_value

次のセットアップでvariable_scopeを使用しているとき、私は予想外の命名規則を経験しています:

with tf.variable_scope("my_scope"): 
    var = tf.Variable(initial_value=other_var.initialized_value()) 

それを保持しています

other_var.name = 'outer_scope/my_scope/other_var_name:0' 

このコードでは、この時点で同じスコープを「再利用」しています。直感的に、私はこれで問題が表示されていないが、次の処理が行われます。

var.name = 'outer_scope/my_scope_1/var_name:0' 

だから明らかに、TFは「my_scope」と幸せではないと「_1」を追加する必要があります。 「outer_scope」は同じままです。

"other_var"で初期化しないと、この現象は発生しません。

説明をいただければ幸いです! THX

マット

答えて

3

あなたはtf.Variable`」の代わりにtf.get_variable()を使用する場合があります。

with tf.variable_scope('var_scope', reuse=False) as var_scope: 
    var = tf.get_variable('var', [1]) 
    var2 = tf.Variable([1], name='var2') 
    print var.name # var_scope/var:0 
    print var2.name # var_scope/var2:0 

with tf.variable_scope('var_scope', reuse=True) as var_scope: 
    var = tf.get_variable('var', [1]) 
    var2 = tf.Variable([1], name='var2') 
    print var.name # var_scope/var:0 
    print var2.name # var_scope_1/var2:0 

私はあなたが成功し、本当にあなたの変数名は、あなたがかもしれませんがvariable_scopename_scope inteadをという名前の別の範囲で影響何をしたいvariable_scope、「再入力」しているが、あなたの例ではということだと思います。この背後にある理由推測。公式文書からhereあなたはそれを見ることができます:

我々はtf.variable_scope(「名前」)で行う、これは暗黙的に tf.name_scope(「名前」)を開きます。

name_scope

はもともと tf.Variableが実際に操作され、その操作名は、それによって作成された変数によって「継承」されますので、操作名(のような addmatmul)を管理するために使用されるので、 name_scopeの名前ではなく、さプレフィックスとして variable_scopeが使用されます。

しかし、もしあなたがtf.Variableを使用したい場合は、あなたが直接with文でname_scopeを使用することができますに注意を払うために

with tf.name_scope('n_scope') as n_scope: 
    var = tf.Variable([1], name='var') 
    print var.name #n_scope/var_1:0 

with tf.name_scope(n_scope) as n_scope: 
    var = tf.Variable([1], name='var') 
    print var.name #n_scope/var_1:0 

ことの一つは、あなたが引数として以前からキャプチャスコープvaribleを渡すべきであるということですに渡される引数に

with tf.name_scope('n_scope') as n_scope: 
     var = tf.Variable([1], name='var') 
     print var.name #n_scope/var_1:0 

    with tf.name_scope('n_scope') as n_scope: 
     var = tf.Variable([1], name='var') 
     print var.name #n_scope_1/var_1:0 

ご注意:あなたは、むしろstrスコープ名を使用するよりも、名前のスコープを「再入力」にしたいwith声明。次のように

名引数が解釈されます:

  1. 文字列は、新しい名前のスコープを作成します(「/」で終わらない)、この動作は再びname_scopeのドキュメンテーション文字列に記述されています コンテキストで作成されたすべての操作の接頭辞に、 という名前が追加されています。以前に名前が使用されていた場合は、 によってself.unique_name(name)という名前で一意になります。

  2. 以前 スコープとしてg.name_scope(...)とからキャプチャ範囲:ステートメントは、再入力、既存のスコープすることが可能となり、「絶対」名のスコープ、 として扱われます。

  3. Noneまたは空の文字列の値は、現在の名前 のスコープをトップレベル(空の)名前スコープにリセットします。

+0

Thxを、超便利! – Mathew

関連する問題