1. ホーム
  2. tensorflow

[解決済み] なぜtf.name_scope()を使うのか?

2022-02-02 04:56:34

質問

TensorFlowのチュートリアルを読んでいると、以下のように書かれている。

with tf.name_scope('read_inputs') as scope:
    # something

a = tf.constant(5)

そして

with tf.name_scope('s1') as scope:
    a = tf.constant(5)

は同じ効果があるようです。では、なぜ name_scope ?

解決方法は?

定数を再利用するユースケースは見当たりませんが、スコープと変数の共有に関する関連情報を紹介します。

スコープ

  • name_scope は、すべての操作のプレフィックスとしてスコープを追加します。

  • variable_scope は、すべての変数と操作にプレフィックスとしてスコープを追加します。

変数のインスタンス化

  • tf.Variable() コンストラクタは、変数名の前に現在の name_scopevariable_scope

  • tf.get_variable() コンストラクタが無視する name_scope をプレフィックスとするのみで、現在の variable_scope

例えば、こんな感じです。

with tf.variable_scope("variable_scope"):
     with tf.name_scope("name_scope"):
         var1 = tf.get_variable("var1", [1])

with tf.variable_scope("variable_scope"):
     with tf.name_scope("name_scope"):
         var2 = tf.Variable([1], name="var2")

生成する

var1 = <tf.Variable 'variable_scope/var1:0' shape=(1,) dtype=float32_ref>

var2 = <tf.Variable 'variable_scope/name_scope/var2:0' shape=(1,) dtype=string_ref>

変数の再利用

  • 常に使用する tf.variable_scope を使用して、共有変数のスコープを定義します。

  • 変数の再利用を行う最も簡単な方法は reuse_variables() 以下のように

with tf.variable_scope("scope"):
    var1 = tf.get_variable("variable1",[1])
    tf.get_variable_scope().reuse_variables()
    var2=tf.get_variable("variable1",[1])
assert var1 == var2

  • tf.Variable() は常に新しい変数を作成し、既に使用されている名前で変数が作成された場合は、単に _1 , _2 などを追加すると、コンフリクトが発生する可能性があります :(