これらの機能の違いは何ですか?
tf.variable_op_scope(values, name, default_name, initializer=None)
変数を作成するオペレーションを定義するためのコンテキスト マネージャーを返します。このコンテキスト マネージャーは、指定された値が同じグラフからのものであることを検証し、そのグラフがデフォルトのグラフであることを確認し、名前スコープと変数スコープをプッシュします。
tf.op_scope(values, name, default_name=None)
Python オペレーションを定義するときに使用するコンテキスト マネージャーを返します。このコンテキスト マネージャーは、指定された値が同じグラフからのものであることを検証し、そのグラフがデフォルトのグラフであることを確認し、名前スコープをプッシュします。
tf.name_scope(name)
Graph.name_scope()
デフォルトのグラフを使用するためのラッパー。Graph.name_scope()
詳細については、を参照してください。
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
変数スコープのコンテキストを返します。変数スコープを使用すると、新しい変数を作成したり、既に作成された変数を共有したりできるほか、誤って作成または共有しないようにチェックできます。詳細については、「変数スコープの使用方法」を参照してください。ここでは、いくつかの基本的な例のみを示します。
ベストアンサー1
TensorFlow
まず、変数の共有について簡単に紹介しましょう。変数の共有とは、変数への参照を渡すことなく、コードのさまざまな部分でアクセスされる変数を共有できるようにするメカニズムです。
方法tf.get_variable
変数名を引数として指定すると、その名前で新しい変数を作成するか、以前に作成された変数を取得することができます。これは、tf.Variable
呼び出されるたびに新しい変数を作成するコンストラクターです (同じ名前の変数がすでに存在する場合は、変数名にサフィックスが追加される可能性があります)。
変数共有メカニズムの目的で、別の種類のスコープ (変数スコープ) が導入されました。
結果として、次の 2 つの異なるタイプのスコープが存在することになります。
- 名前スコープ、作成方法
tf.name_scope
- 変数スコープ、以下を使用して作成
tf.variable_scope
両方のスコープは、すべての操作と、を使用して作成された変数に同じ効果をもたらします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_scope
とvariable_op_scope
の両方が非推奨name_scope
および はおよびに置き換えられますvariable_scope
。