tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope之间的关系

tensorflow提供通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。

1. tf.Variable与tf.get_variable

tensorflow中通过变量名获取变量的机制主要通过tf.get_variable和tf.variable_scope实现。当然,变量也可以通过tf.variable来创建。

当tf.get_variable用于变量创建时,和tf.variable的功能基本等价。

 

#以下两个定义是等价的
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape=[1], name='v')

 

 

tf.get_variable和tf.variable的最大区别在于:

tf.variable的变量名是一个可选项,通过name='v'的形式给出。但tf.get_variable必须指定变量名。

 

2. tf.get_variable与tf.variable_scope

先来解释一下reuse问题:

当reuse为false或none时,同一个tf.variable_scope下面的变量名不能相同;

当reuse为true时,tf.variable_scope只能获取已经创建过的向量。

 

例如:

 

#reuse=False时会报错的情况:
with tf.variable_scope('foo'):
    v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))
with tf.variable_scope('foo'):
    v1 = tf.get_variable('v',[1])

在这种情况下会报错:Variable foo/v already exists, disallowed.Did you mean to set reuse=True in Varscope?

其原因就是在命名空间foo中创建了相同的变量。如果要在foo下创建一个变量v1,其name=‘v’,只需要将reuse设置为Ture就ok了。

 

将上面第二部分代码修改为:

 

with tf.variable_scope('foo', reuse=True):
    v1 = tf.get_variable('v',[1])
    print(v1.name)      #结果为foo/v

 

当reuse已经设置为True时,tf.variable_scope只能获取已经创建过的变量。

 

这个时候,在命名空间bar中创建name=‘v’的变量v3,将会报错:Variable bar/v dose not exists, diallowed. Did you mean to set reuse=None in VarScope?

 

with tf.variable_scope('bar', reuse=True):
    v3 = tf.get_variable('v',[1])

 

 

 

简而言之,reuse=False时,tf.variable_scope创建变量;reuse=True时,tf.variable_scope获取变量

 

3. tf.variable_scope与tf.name_scope

tf.name_scope函数也提供了命名空间管理的功能。这两个函数在大部分情况下是等价的,唯一的区别是在使用tf.get_variable函数时。

tf.get_variable函数不受tf.name_scope的影响
我们从代码看下这句话的具体意思。
首先是tf.variable_scope:

 

with tf.variable_scope('foo'):
    a = tf.get_variable('bar',[1])
    print(a.name)#结果为foo/bar:0

再看tf.name_scope:

with tf.name_scope('a'):
    a=tf.Variable([1])
    print(a.name)#结果为a/Variable:0

    b=tf.get_variable('b',[1])
    print(b.name)#结果为b:0

从这个结果中,我们能很清晰地看到,tf.get_variable创建的变量并不是a/b:0,而是b:0。这就表示了在tf.name_scope函数下,tf.get_variable不受其约束

 

 (参考自https://blog.csdn.net/qq_22522663/article/details/78729029

上一篇:REUSE_ALV_FIELDCATALOG_MERGE根据结构名称创建GT_FIELDCAT


下一篇:[REUSE_ALV_GRID_DISPLAY_LVC]-显示单选按钮(radio button)