variable_scope和name_scope的区别

想要清楚variable_scope和name_scope的区别。你只需要:

搞清楚 tf.Variable() 和 tf.get_variable()

tf.Variable() 其实本质是 tf.Variable.__init__() , 永远都是用于创建variable的

而 tf.get_variable() 是查看指定name的variable存在与否,存在则复用,不存在则创建。

两者的另一个区别在于,get_variable不受name_scope 的影响。
但是两者都受 variable_scope的影响。

get_variable的用于有俩

1 复用一个Variable

tf.get_variable_scope().reuse == True

2 防止重名Variable

tf.get_variable_scope().reuse == False

import tensorflow as tf
v = tf.Variable( [2,2,3,32],name='weights')
with tf.variable_scope('variable_scope'):
    v1 = tf.get_variable('weights', [2,2,3,32])

with tf.name_scope('name_scope'):
    v2 = tf.get_variable('weights',[2,2,3,32])

print v.name
print v1.name
print v2.name

输出结果如下:
weights:0
variable_scope/weights:0
weights_1:0

注意,如果用的是Variable() 是允许同名的,他会自动给你加上下划线并且编号,但是weights和weights_1并不是相同的变量
但是如果改成get_variable 则需要设置 reuse,设置完了以后才能确定是允不允许复用,一旦允许复用,同名的就是同变量。

PS.在调用variable_scope()的时候,会自动调用name_scope().
所以一句话,总结就是get_variable 可以不受 name_scope()的约束
其他情况都会在Variable的name之前都会加上scope的name。

参考 tensorflow 官方文档对name_scope的解释

你可能感兴趣的:(variable_scope和name_scope的区别)