关于tensorflow:如何理解TensorFlow中name与variable-scope的区别

48次阅读

共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。

tf 中的命名空间

最近在模型的搭建中遇到 tf 中变量的共享空间相干问题,故记之。
出于变量共享与传递的思考,TensorFlow 中引入了变量 (或者叫 域)命名空间的机制。
此测试环境在 TensorFlow1.X 下:import tensorflow as tf

  • name scope:通过调用 tf.name_scope 产生
  • variable scope:通过调用 tf.variable_scope 产生

在命名空间中创立变量有以下两种形式:

  • tf.Variable:每次调用此函数的时候都会创立一个新的变量,如果该变量名称已存在,则会在该变量名称后增加一个后缀。
  • tf.get_variable:以该名称创立新变量,若已存在,则检索该名称的变量并获取其援用。

实例一

Script:

with tf.variable_scope("embeddin") as embedding_scope:

    testing2 = tf.Variable(tf.random_uniform((7, 10), -1.0, 1.0), name='testing2')

    testing3 = tf.get_variable(name='testing3', shape=[7, 10],initializer=tf.constant_initializer(1))
    
with tf.name_scope("optimization"):

    testing = tf.Variable(tf.random_uniform((7, 10), -1.0, 1.0), name='testing')

    testing1 = tf.get_variable(name='testing1', shape=[7, 10],initializer=tf.constant_initializer(1))

Output of variable:


>>> testing2
<tf.Variable 'embeddin/testing2:0' shape=(7, 10) dtype=float32_ref>
>>> testing3
<tf.Variable 'embeddin/testing3:0' shape=(7, 10) dtype=float32_ref>
>>> testing
<tf.Variable 'optimization/testing:0' shape=(7, 10) dtype=float32_ref>
>>> testing1
<tf.Variable 'testing1:0' shape=(7, 10) dtype=float32_ref>

实例一阐明在 tf.name_scope 中调用 tf.get_variable 产生的变量在调用上是不受域空间的限度的,也就是为全局变量;其余状况皆为作用域变量。

实例二

Script:

1. 将实例一当中的 testing3 改为testing2

testing3 = tf.get_variable(name='testing2', shape=[7, 10],initializer=tf.constant_initializer(1))

2. 将实例一当中的 testing1 改为testing

testing1 = tf.get_variable(name='testing', shape=[7, 10],initializer=tf.constant_initializer(1))

Output of variable:


>>> testing2
<tf.Variable 'embeddin/testing2:0' shape=(7, 10) dtype=float32_ref>
>>> testing3
<tf.Variable 'embeddin/testing2_1:0' shape=(7, 10) dtype=float32_ref>
>>> testing
<tf.Variable 'optimization/testing:0' shape=(7, 10) dtype=float32_ref>
>>> testing1
<tf.Variable 'testing:0' shape=(7, 10) dtype=float32_ref>

实例二论断:

  • 前两个 output 阐明如果想在 TensorFlow 中想通过 tf.get_variable 获取一个变量的援用,以上形式行不通的(详见实例三)。而是会创立一个以($var_name)_1 命名的该变量的正本。
  • 后两个 output 再一次验证了实例一中的论断:即就是创立出以该名称命名的一个全局变量和一个作用域变量。

实例三

Script:

with tf.variable_scope("embeddin",reuse=True) as embedding_scope:

    testing2 = tf.Variable(tf.random_uniform((7, 10), -1.0, 1.0), name='testing2')

    testing3 = tf.get_variable(name='testing2', shape=[7, 10],initializer=tf.constant_initializer(1))

Output of variable:

ValueError: Variable embeddin/testing2 does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope?

此谬误阐明了 tf.Variable 创立的变量不能被 share,而 tf.get_variable() 却能够。
以上!大家如果感觉有用的话,反对一下哦~

正文完
 0