web-dev-qa-db-ja.com

variable_scopeとname_scopeの違いは何ですか?

違いは何ですか variable_scopeおよびname_scope可変範囲チュートリアルvariable_scope暗黙的に開くname_scope。また、name_scopeは、自動的にその名前をスコープ名でも展開します。それで、違いは何ですか?

71

variable_scopename_scope (ほとんど同じように見えました)の違いを理解するのに問題がありました。単純な例を作成してすべてを視覚化しようとしました。

_import tensorflow as tf
def scoping(fn, scope1, scope2, vals):
    with fn(scope1):
        a = tf.Variable(vals[0], name='a')
        b = tf.get_variable('b', initializer=vals[1])
        c = tf.constant(vals[2], name='c')
        with fn(scope2):
            d = tf.add(a * b, c, name='res')

        print '\n  '.join([scope1, a.name, b.name, c.name, d.name]), '\n'
    return d

d1 = scoping(tf.variable_scope, 'scope_vars', 'res', [1, 2, 3])
d2 = scoping(tf.name_scope,     'scope_name', 'res', [1, 2, 3])

with tf.Session() as sess:
    writer = tf.summary.FileWriter('logs', sess.graph)
    sess.run(tf.global_variables_initializer())
    print sess.run([d1, d2])
    writer.close()
_

ここで、いくつかの変数と定数を作成し、それらをスコープにグループ化する関数を作成します(提供したタイプによって異なります)。この関数では、すべての変数の名前も出力します。その後、グラフを実行して結果の値の値を取得し、イベントファイルを保存してテンソルボードで調査します。これを実行すると、次のものが得られます。

_scope_vars
  scope_vars/a:0
  scope_vars/b:0
  scope_vars/c:0
  scope_vars/res/res:0 

scope_name
  scope_name/a:0
  b:0
  scope_name/c:0
  scope_name/res/res:0 
_

TB(bは_scope_name_長方形の外側にあります)を開くと、同様のパターンが表示されます: enter image description here


これはあなたに答えを与えます

これで、tf.variable_scope()がすべての変数(作成方法に関係なく)、ops、定数の名前にプレフィックスを追加することがわかります。一方、tf.name_scope()は、tf.get_variable()で作成された変数を無視します。これは、使用する変数とスコープを知っていると想定しているためです。

変数の共有 に関する優れたドキュメントは、

tf.variable_scope()tf.get_variable()に渡される名前の名前空間を管理します。

同じドキュメントで、変数スコープの機能と有用なタイミングについて詳しく説明しています。

48
Salvador Dali

tf.get_variableではなくtf.Variableを使用して変数を作成すると、Tensorflowは、同じメソッドで作成された変数の名前のチェックを開始して、それらが衝突するかどうかを確認します。もしそうなら、例外が発生します。 tf.get_variableを使用してvarを作成し、tf.name_scopeコンテキストマネージャーを使用して変数名のプレフィックスを変更しようとすると、Tensorflowが例外を発生させるのを防ぎません。この場合、tf.variable_scopeコンテキストマネージャーのみがvarの名前を効果的に変更します。または、変数を再利用する場合は、varを2回作成する前にscope.reuse_variables()を呼び出す必要があります。

要約すると、tf.name_scopeはそのスコープで作成されたすべてのテンソルにプレフィックスを追加し(tf.get_variableで作成された変数を除く)、tf.variable_scopetf.get_variableで作成された変数にプレフィックスを追加します。

39
cesarsalgado

tf.variable_scopeは、Variable再利用を処理するtf.name_scopeの進化版です。お気づきのとおり、tf.name_scope以上のことを行うため、tf.name_scopeを使用する本当の理由はありません。驚くことではありません。 TF開発者は、tf.variable_scope

tf.name_scopeがまだ存在するという私の理解は、これら2つの動作にわずかな非互換性があり、tf.variable_scopeのドロップイン置換としてtf.name_scopeを無効にすることです。

2
P-Gn