终于考完了数值分析,终于可以接上tensorflow学习了。。
TensorFlow通过名字管理变量
在写代码的时候,我们会发现,参数真的太多太多了,传这里传一下weight,那里传一下bias,头都要大了,还好,TensorFlow为我们提供了一种通过名字管理变量的办法,这里说的名字不同于变量名。举个栗子,有个变量就是[[1],[1]],然后我们给它叫一个名字,这个名字是唯一的,比如“one_matrix”,好了,下次张三用的时候,他就直接写a=one_matrix,李四用的时候,他就写b=one_matrix,有点全局变量的意思。由此可见,可以通过多个不同变量名(a、b)的变量来引用这个被取了名字的变量one_matrix。
import tensorflow as tf
with tf.variable_scope("namespace"):
# 创建一个变量
v=tf.get_variable(name="var",shape=[2,3],initializer=tf.constant_initializer(value=2.))
with tf.variable_scope("namespace",reuse=True):
# 引用定义好的变量
v1=tf.get_variable(name="var")
print(v1.shape)
print(v1.name)
print(v==v1)
在namespace命名空间下创建了一个名叫var的变量(常量)。下次再用它的时候也要打开相应的命名空间,并且设置reuse=True,然后再引用它,并且只要告诉名字就够了,不要再给出过shape、initializer这些参数。如果要在这个命名空间里加一个变量,就reuse=False,然后再添加就好了。
print(v==v1)这句输出是True,说明两个变量(v,v1)引用的是同一个东西。
variable_scope 嵌套
variable_scope 这个东西是可以嵌套的,可以看作就是一层层的目录,命名空间就看作是目录名,里面还会有别的目录或者变量。需要注意的就是,reuse这个变量的值如果没显示指明,就和上一层的一样,如果是根命名空间,那就是False,来个代码直观理解一下。
# variable_scope 嵌套
with tf.variable_scope("root"):
# 这个输出为False
print(tf.get_variable_scope().reuse)
# 创建一个root_var变量
v1=tf.get_variable(name="root_var",shape=[2,3],initializer=tf.constant_initializer(value=2.))
with tf.variable_scope("sub_root",reuse=True):
# 这个输出为True
print(tf.get_variable_scope().reuse)
with tf.variable_scope("sub_sub_root"):
# 这个输出为True
print(tf.get_variable_scope().reuse)
# 这个输出为False,回到了根命名空间
print(tf.get_variable_scope().reuse)
# 输出如下
False
True
True
False
当然,可以在命名空间a中,引用命名空间b里面创建的变量。前提是你必须知道那个给好了名字的变量具体是怎么嵌套的。接上面的代码,我们可以在一个“”命名空间下,去用root下的root_var变量,有点类似目录中文件选择。
这个命名空间的名字必须是空的,假如不是空(例如给个b),就成了b/root/root_var,这个显然是没有的。
with tf.variable_scope("", reuse=True):
# 使用root命名空间下的root_var变量
v2=tf.get_variable(name="root/root_var")
print(v2.name)
print(v2.shape)
#输出如
root/root_var:0
(2, 3)