違いは何ですか variable_scope
およびname_scope
? 可変範囲チュートリアル はvariable_scope
暗黙的に開くname_scope
。また、name_scope
は、自動的にその名前をスコープ名でも展開します。それで、違いは何ですか?
variable_scope と name_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
_長方形の外側にあります)を開くと、同様のパターンが表示されます:
これはあなたに答えを与えます:
これで、tf.variable_scope()
がすべての変数(作成方法に関係なく)、ops、定数の名前にプレフィックスを追加することがわかります。一方、tf.name_scope()
は、tf.get_variable()
で作成された変数を無視します。これは、使用する変数とスコープを知っていると想定しているためです。
変数の共有 に関する優れたドキュメントは、
tf.variable_scope()
:tf.get_variable()
に渡される名前の名前空間を管理します。
同じドキュメントで、変数スコープの機能と有用なタイミングについて詳しく説明しています。
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_scope
はtf.get_variable
で作成された変数にプレフィックスを追加します。
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
を無効にすることです。