tf.Variable,tf.get_variable,tf.variable_scope,tf.name_scope区别分析

1.tf.Variable与tf.get_variable

①在创建变量的时候,两者是等价的
②tf.Variable的变量名是一个可选项,而tf.get_variable必须要有变量名

import tensorflow as tf
v=tf.get_variable(name='v',shape=[1],initializer=tf.constant_initializer(1.0))
v=tf.Variable(tf.constant(1.0,shape=[1],name='v'))

2.tf.variable_scope与tf.name_scope

①tf.get_variable()不受tf.name_scope影响
②当reuse为False或None(默认)时,同一个名字的tf.variable_scope()下**使用tf.get_variable()**创建的变量名不能相同;当reuse为True时,tf.variable_scope()只能获取已经创建过的变量,而不能通过tf.Variable和tf.get_variable创建变量了

tf.reset_default_graph()  #必须要先清理掉之前的创建的变量才行哦
with tf.variable_scope('foo'):  #默认是reuse=False
  v=tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0)) #一定要注意参数的输入顺序,如果不是按照默认顺序,请加上参数名
  v1=tf.Variable(tf.constant(value=1.0),name='v1')  #使用tf.Variable()可以在foo/下建立两个相同名字的变量,但是会默认给第二个foo定义为foo_1
  print(v1.name)
with tf.variable_scope('foo'):  #默认是reuse=False
  #v=tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))  #加上这句话就会报错,因为处在foo/下存在两个相同的'v'变量
  v1=tf.Variable(tf.constant(value=1.0),name='v1')
  print(v1.name)
with tf.variable_scope('foo',reuse=True):
  v3=tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))  #当reuse为True时,foo/下可以出现相同名字的变量,但是此时的tf.get_variable只是用于获取上面创建好的变量'v'
  print(v3.name)
  #输出
foo/v1:0
foo_1/v1:0
foo/v:0
tf.reset_default_graph()
with tf.name_scope('foo'):  #名字域是没有reuse的,同样,不能使用tf.get_variable()来创建名字相同的两个变量
  v=tf.get_variable(name='v',initializer=tf.constant(1.0))  #tf.get_variable()创建的变量不会受name_scope的影响的
  v1=tf.Variable(tf.constant(1.0),name='v1')
  print(v.name)
  print(v1.name)
with tf.name_scope('foo'):  #名字域是没有reuse的,所以肯定不能在同一个名字域下出现两个相同名字的变量
  #v=tf.get_variable(name='v',initializer=tf.constant(1.0))
  v1=tf.Variable(tf.constant(1.0),name='v1')
  print(v.name)
  #输出
v:0
foo/v1:0
v:0
tf.reset_default_graph()
with tf.variable_scope('foo'):
  v=tf.get_variable(name='v',initializer=tf.constant(1.0))
with tf.variable_scope('foo',reuse=True):
  v=tf.Variable(tf.constant(1.0),name='v')  #虽然在reuse=True下,但仍可以用tf.Variable()进行变量的创建工作
  print(v.name)
  v1=tf.Variable(tf.constant(1.0),name='v')  #如果再创建一个'v'则它的名字就变成了foo_1/v_1:0
  print(v1.name)
  v2=tf.get_variable(name='v1',initializer=tf.constant(1.0))
  #输出
foo_1/v:0
foo_1/v_1:0
ValueError: Variable foo/v1 does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope?

3.reuse的深层探索

①除了在tf.variable_scope()中设置reuse外,还可以通过tf.get_variable_scope().reuse_variables()来设置
②注意上面这种设置方式有以下几个特点:
1‘只对当前with下的设置有效,退出了with后自动回复设置
2’如果顶格写上,则后面所有的with都会被默认设置为reuse=True
3’可以通过tf.get_variable_scope().reuse来获取当前的reuse状态

tf.reset_default_graph()
#tf.get_variable_scope().reuse_variables()  #全局使用reuse
with tf.variable_scope('foo',reuse=False):  #这里设置为False也会报错,因为已经被全局设定为了reuse=True了
  v=tf.get_variable(name='v',initializer=tf.constant(1.0))
  print(v.name)
tf.get_variable_scope().reuse_variables()  #全局使用reuse
with tf.variable_scope('foo'):  #这里不用设置reuse=True了
  v=tf.get_variable(name='v',initializer=tf.constant(1.0))
  print(v.name)
  #输出
foo/v:0
foo/v:0

本人现在的研究方向是:
图像的语义分割,如果有志同道合的朋友,可以组队学习
[email protected] qq:1355365561

你可能感兴趣的:(deep,learning)