tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope

tf.Variable与tf.get_variable

     tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。 当然,变量也可以通过tf.Varivale来创建。当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.Variable() 和tf.get_variable()的区别:

tf.Variable() 每次调用都会产生一个新的变量,他会自动检测命名冲突并自行处理,变量名称是一个可选参数,例如:

a1 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')
a2 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='a1')
print(a1.name)
print(a2.name)
print(a1==a2)

运行结果:

f1/a1:0
f1/a1_1:0
False    # a2实际变成了a1_1并且和a1 不是同一个变量

     tf.get_variable()则不同,遇到重命名的变量创建且变量名没有设置成共享变量(所谓的共享是指在同一参数空间下的共享,参数空间名称不一样就不能共享了)时,就会报错变量名称这个参数是必填参数,tf.get_variable()会根据这个参数去创建或者获取变量。tf.Variable:tf.Variable的变量名是一个可选项,通过name=’v’的形式给出

tf.name_scope()

    tf.name_scope()主要用于管理图中各种op,而tf.variable_scope()主要用于管理图中变量的名字,这两个函数在大部分情况下是等价的,唯一的区别是tf.get_variable()创建的变量名不受 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不受其约束

 tf.get_variable与tf.variable_scope

     TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。在这里主要解释下reuse问题:当reuse为False或者None时(这也是默认值),tf.get_variable()函数只能创建新的变量同一个tf.variable_scope下面的变量名不能相同,当同名变量已经存在时,函数就报错;当reuse为True时,tf.variable_scope只能获取已经创建过的变量,即该空间下的所有tf.get_variable()函数将直接获取已经创建的变量,如果参数不存在tf.get_variable()函数将会报错。

当 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])

其原因就是在命名空间foo中创建了相同的变量。如果我要在foo下创建一个变量v1,其name不能是‘v’

只需要将reuse设置为Ture就ok了。将上面第二部分代码修改为:

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

from:https://blog.csdn.net/qq_22522663/article/details/78729029
from:https://blog.csdn.net/hyxing520/article/details/80889496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值