tf.Variable() :局部变量。
特点:永远生成新的变量,不会与已存在的variable重名
tf.name_scope():局部空间。
特点:永远生成新的命名空间,不会与已存在的name_scope、variable_scope冲突 ,也就是说name_scope也是局部的、临时的
tf.get_variable():全局变量。
特点:可共享,不能重复,解决了众多方法调用时 参数来回传递的困境,
tf.variable_scope():全局空间。
特点:跟get_variable()性质雷同,如果当前已存在同名variable_scope,则重复使用已存在的。
import tensorflow as tf;
with tf.variable_scope('V'):#新建V全局空间
a1 = tf.get_variable(name='var', shape=[1], initializer=tf.constant_initializer(1))#V/var
a2 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') # 新建变量名 V/var_1
with tf.variable_scope('V',reuse=True):
a3 = tf.get_variable(name='var', shape=[1], initializer=tf.constant_initializer(1)) #使用已存在的全局空间V/var
a4 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #检查V已存在,新建局部空间V_1/var
a5 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #在当前局部变量下再新建变量V_1/var_1
with tf.variable_scope('V',reuse=True):
a6 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') # 全局空间已存在,创建新的V_2 作为局部空间
a7 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')
a8 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #无临时空间
a9 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')
with tf.name_scope('V_3'): #新建局部空间V_3,
a10 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')
a11 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')#变量会新建name
with tf.name_scope('V_3'):#再次调用已存在的局部空间,但是此时会新建一个name_scope 增加后缀编号V_3_1
a12 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')
with tf.Session() as sess:
tf.global_variables_initializer().run()
print('a1.name=%s'%a1.name)
print('a2.name=%s'%a2.name)
print('a3.name=%s'%a3.name)
print('a4.name=%s'%a4.name)
print('a5.name=%s'%a5.name)
print('a6.name=%s'%a6.name)
print('a7.name=%s'%a7.name)
print('a8.name=%s'%a8.name)
print('a9.name=%s'%a9.name)
print('a10.name=%s'%a10.name)
print('a11.name=%s'%a11.name)
print('a12.name=%s'%a12.name)
输出:
a1.name=V/var:0
a2.name=V/var_1:0
a3.name=V/var:0
a4.name=V_1/var:0
a5.name=V_1/var_1:0
a6.name=V_2/var:0
a7.name=V_2/var_1:0
a8.name=var:0
a9.name=var_1:0
a10.name=V_3/var:0
a11.name=V_3/var_1:0
a12.name=V_3_1/var:0