variable_op_scope和op_scope现在都已弃用,根本不应该使用。
关于另外两个,我在理解variable_scope和name_scope(它们看起来几乎一样)之间的区别时也有问题,然后我尝试通过创建一个简单的示例来可视化所有内容:
import tensorflow as tf
def scoping(fn, scope1, scope2, vals):
with fn(scope1):
a = tf.Variable(vals[0], name='a')
b = tf.get_variable('b', initializer=vals[1])
c = tf.constant(vals[2], name='c')
with fn(scope2):
d = tf.add(a * b, c, name='res')
print '\n '.join([scope1, a.name, b.name, c.name, d.name]), '\n'
return d
d1 = scoping(tf.variable_scope, 'scope_vars', 'res', [1, 2, 3])
d2 = scoping(tf.name_scope, 'scope_name', 'res', [1, 2, 3])
with tf.Session() as sess:
writer = tf.summary.FileWriter('logs', sess.graph)
sess.run(tf.global_variables_initializer())
print sess.run([d1, d2])
writer.close()
在这里,我创建了一个函数,它创建了一些变量和常数,并将它们分组在作用域(取决于我提供的类型)。在这个函数中,我还打印了所有变量的名称。之后,我执行这个图来获取结果值的值,并保存事件文件以在TensorBoard中调查它们。如果你运行这个,你会得到以下结果:
scope_vars
scope_vars/a:0
scope_vars/b:0
scope_vars/c:0
scope_vars/res/res:0
scope_name
scope_name/a:0
b:0
scope_name/c:0
scope_name/res/res:0
如果你打开TensorBoard,你会看到类似的模式(正如你所看到的b在scope_name矩形之外):
这就给出了答案:
现在,您可以看到tf.variable_scope()为所有变量(无论您如何创建它们)、ops、常量的名称添加了一个前缀。另一方面,tf.name_scope()忽略使用tf.get_variable()创建的变量,因为它假定您知道要在哪个范围内使用哪个变量。
一份关于共享变量的文档会告诉您这一点
tf.variable_scope():管理传递给tf.get_variable()的名称空间。
同样的文档提供了变量作用域如何工作以及何时有用的更多细节。