1. tf.Variable与tf.get_variable

tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。
TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。
当然,变量也可以通过tf.Varivale来创建。当tf.get_variable用于变量创建时,和tf.Variable的功能基本等价

?
1
2
3
#以下两个定义是等价的
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_varialbe和tf.Variable最大的区别在于:tf.Variable的变量名是一个可选项,通过name=’v’的形式给出。但是tf.get_variable必须指定变量名

2. tf.get_variable与tf.variable_scope

上面已经提到过了:TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。在这里,我主要解释下大家深恶痛绝的reuse问题
其实只要记住一件事情就ok了:当reuse为False或者None时(这也是默认值),同一个tf.variable_scope下面的变量名不能相同;当reuse为True时,tf.variable_scope只能获取已经创建过的变量。
下面我们通过代码来看下:

?
1
2
3
4
5
6
#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了。将上面第二部分代码修改为:

?
1
2
3
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?

?
1
2
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.variable_scope,tf.name_scope函数也提供了命名空间管理的功能。这两个函数在大部分情况下是等价的,唯一的区别是在使用tf.get_variable函数时。
tf.get_variable函数不受tf.name_scope的影响
我们从代码看下这句话的具体意思。
首先是tf.variable_scope:

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

  

再看tf.name_scope:

?
1
2
3
4
5
6
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
0
0
« 上一篇: word2vec原理CBOW与Skip-Gram模型基础
» 下一篇: SMO详解
	</div>
	<div class="itemdesc">
		发表于 <span id="post-date">2018-07-05 22:29</span> <a href="https://www.cnblogs.com/MY0213/">善良的大猪猪</a> 阅读(<span id="post_view_count">529</span>) 评论(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=9270864" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(9270864);return false;">收藏</a>
	</div>
</div>