Press "Enter" to skip to content

如何理解TensorFlow中name与variable scope的区别

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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>

 

实例二结论:

 

tf.get_variable

 

实例三

 

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()
却可以。

 

以上!大家如果觉得有用的话,支持一下哦~

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注