tf.variable_scope可以控制tf.get_variable的语义,当tf.variable_scope的reuse=True时,tf.get_variable 可以直接获取已经创建的变量。以下代码展示了如何管理变量
#变量管理
import tensorflow as tf
v1=tf.get_variable("v",[1])
print(v1.name)
#输出v:0,v表示变量名称,“:0”表示这个变量是生成这个运算的第一个结果
with tf.variable_scope("foo"):
v2=tf.get_variable("v",[1])
print(v2.name)
#输出foo/v:0,在tf.variable_scope创建变量,名称前灰加入民命空间变量,通过/分割民命空间的名称和变量的名称。
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v3=tf.get_variable("v",[1])
print(v3.name)#输出foo/bar/v:0,命名空间可以嵌套,同事变量名的名称也会加入所有命名空间作为前缀
v4=tf.get_variable("v1",[1])
print(v4.name)
with tf.variable_scope("",reuse=True):
v5=tf.get_variable("foo/bar/v",[1])
print(v5==v3)
v6=tf.get_variable("foo/v",[1])
print(v6==v2)
针对上一篇博客中已经使用的代码前向传播过程,以下代码展示了如何使用变量管理来管理比较多的代码命名。
import tensorflow as tf
''''''
def inference(input_tensor,reuse=False):
with tf.variable_scope("layer1",reuse=reuse):
weights=tf.get_variable("weights",[INPUT_NODE,LAYER1_NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))
biases=tf.get_variable("biases",[LAYER1],initializer=tf.constant_initializer(0.0))
layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases)
with tf.variable_scope("layer2",reuse=False)
weights=tf.get_variable("weights",[LAYER1_NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))
biases=tf.get_variable("biases",[OUT_NODE],initializer=tf.constant_initializer(0.0))
layer2=tf.matmul(layer1,weights)+biases
return layer2
x=tf.placeholder(tf.float32,shape=[None,INPUT_NODE],name="x-input")
y=inference(x)