tf.name_scope()和tf.variable_scope()的用法

tf.name_scope()实现变量的分级管理,该作用域中的tf.Variable变量的name前面会自动加上scope_name的前缀,而tf.get_variable变量不会受到影响,既不会加前缀
tf.variable_scope可以让变量有相同的命名,包括tf.get_variable得到的变量,还有tf.Variable的变量

tf.name_scope可以让变量有相同的命名,只是限于tf.Variable的变量

import tensorflow as tf
with tf.name_scope("scp1"):
	v1=tf.get_variable('v1', shape=[1],  initializer=tf.constant_initializer(1.0))
	v1_reuse=tf.get_variable('v1', shape=[1],  initializer=tf.constant_initializer(1.0))#会报错,name也是'v1',v1变量的name'v1重复'
	
	v2=tf.Variable([0.0],dtype=tf.float32,name='v2')
	v2_reuse=tf.Variable([0.0],dtype=tf.float32,name='v2')#不会报错,会自动调整name
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
print('v1.name:',v1.name)
#v1.name: v1:0
print('v2.name:',v2.name)
#v2.name: scp1/v2:0
print('v1_reuse.name:',v1_reuse.name)
#v2_resue.name: scp1/v2:0
print('v2_reuse.name:',v2_reuse.name)
#v2_resue.name: scp1/v2_1:0
#v2_reuse自动调整了name

#用tf.get_variable创建的v1前面没有scope_name‘scp1’
#而用tf.Variable创建的v2有scope_name‘scp1’
	

在tf.name_scope下,tf.get_variable()使用同一个name会报错

在tf.varibale_scope下,设置reuse=tf.AUTO_REUSE,首先在已有点name里查找,如果有,返回给变量,如果没有会创建一个新变量
如果设置reuse=True,只会已有点name里查找,如果有,返回给变量,如果没有,会报错
在tf.varibale_scope下,用tf.get_variable创建的v1的name前面会加上scope_name ‘scp1’,
而在tf.name_scope下 ,namei不会加上variable_name‘scp1’
tf.Variable创建的变量在tf.varibale_scope作用域下和在tf.varibale_scope作用域下没有区别,
name前面会加上scope\variable_name ‘scp1’,

with tf.variable_scope("scp1",reuse=tf.AUTO_REUSE):
    v1=tf.get_variable('v1', shape=[1],  initializer=tf.constant_initializer(1.0))
    v1_reuse=tf.get_variable('v1', shape=[1],  initializer=tf.constant_initializer(1.0))
    
    v2=tf.Variable([0.0],dtype=tf.float32,name='v2')
    v2_reuse=tf.Variable([0.0],dtype=tf.float32,name='v2')
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
print('v1.name:',v1.name)#v1.name: v1:0
print('v2.name:',v2.name)#v2.name: scp1/v2:0
print('v1_reuse.name:',v1_reuse.name)#v2_resue.name: scp1/v2:0
print('v2_reuse.name:',v2_reuse.name)#v2_resue.name: scp1/v2:0
#结果:
#v1.name: scp1/v1:0
#v2.name: scp1_3/v2:0
#v1_reuse.name: scp1/v1:0
#v2_reuse.name: scp1_3/v2_1:0

猜你喜欢

转载自blog.csdn.net/eefresher/article/details/88824058