1. ホーム
  2. tensorflow

[解決済み] tensorflowの名前スコープと変数スコープの違いは何ですか?

2022-01-31 06:09:48

質問内容

これらの機能の違いは何ですか?

tf.variable_op_scope(values, name, default_name, initializer=None)

変数を作成するオペを定義するためのコンテキスト・マネージャを返します。 このコンテキストマネージャーは、与えられた値が同じグラフのものであることを確認し、そのグラフがデフォルトのグラフであることを確認し、名前スコープと変数スコープをプッシュします。


<ブロッククオート

tf.op_scope(values, name, default_name=None)

Python の op を定義するときに使用するコンテキスト・マネージャを返します。 このコンテキストマネージャは、与えられた値が同じグラフのものであることを検証し、そのグラフがデフォルトグラフであることを確認し、名前スコープをプッシュします。


<ブロッククオート

tf.name_scope(name)

のラッパーです。 Graph.name_scope() はデフォルトのグラフを使用します。 参照 Graph.name_scope() をご覧ください。


<ブロッククオート

tf.variable_scope(name_or_scope, reuse=None, initializer=None)

変数スコープのコンテキストを返します。 変数スコープを使用すると、新しい変数を作成したり、すでに作成されている変数を共有したりすることができます。詳しくは、変数スコープの使い方をご覧ください。ここでは、いくつかの基本的な例のみを紹介します。

解決するには?

まず、変数共有について簡単に紹介します。これは TensorFlow これは、コードの異なる部分でアクセスされた変数を、変数への参照を受け渡しすることなく共有することを可能にします。

メソッド tf.get_variable は、変数名を引数として、その名前の新しい変数を作成するか、以前に作成された変数を取得するために使用することができます。これは tf.Variable コンストラクタは呼び出されるたびに新しい変数を作成します (そして、そのような名前の変数がすでに存在する場合は、変数名にサフィックスを追加する可能性があります)。

変数共有の仕組みのために、別の種類のスコープ(変数スコープ)が導入されたのである。

その結果、2種類のスコープを持つことになる。

どちらのスコープも、すべての操作に同じ効果があります。 tf.Variable つまり、操作名や変数名の前にスコープが追加されます。

ただし、名前スコープが無視されるのは tf.get_variable . 次の例でそれを見ることができます。

with tf.name_scope("my_scope"):
    v1 = tf.get_variable("var1", [1], dtype=tf.float32)
    v2 = tf.Variable(1, name="var2", dtype=tf.float32)
    a = tf.add(v1, v2)

print(v1.name)  # var1:0
print(v2.name)  # my_scope/var2:0
print(a.name)   # my_scope/Add:0

を使用してアクセスした変数を配置する唯一の方法です。 tf.get_variable のように、変数スコープを使用することです。

with tf.variable_scope("my_scope"):
    v1 = tf.get_variable("var1", [1], dtype=tf.float32)
    v2 = tf.Variable(1, name="var2", dtype=tf.float32)
    a = tf.add(v1, v2)

print(v1.name)  # my_scope/var1:0
print(v2.name)  # my_scope/var2:0
print(a.name)   # my_scope/Add:0

これにより、プログラムの異なる部分、異なる名前のスコープ内でも、簡単に変数を共有することができます。

with tf.name_scope("foo"):
    with tf.variable_scope("var_scope"):
        v = tf.get_variable("var", [1])
with tf.name_scope("bar"):
    with tf.variable_scope("var_scope", reuse=True):
        v1 = tf.get_variable("var", [1])
assert v1 == v
print(v.name)   # var_scope/var:0
print(v1.name)  # var_scope/var:0


アップデイト

バージョンr0.11現在。 op_scopevariable_op_scope はいずれも 非推奨 で置き換えられ name_scopevariable_scope .