TensorFlow中variable_scope和name_scope之间的区别

variable_scopename_scope什么name_scope ? variables范围教程讲述了隐式打开name_scope variable_scope name_scope 。 我还注意到,在name_scope中创build一个variablesname_scope自动扩展其名称的范围名称。 那么区别是什么呢?

当您使用tf.get_variable而不是tf.Variable创buildvariables时,Tensorflow将开始检查使用相同方法创build的variables名称,以查看它们是否发生碰撞。 如果他们这样做,将会引发exception。 如果使用tf.get_variable创build了一个var,并且您尝试使用tf.name_scope上下文pipe理器来更改variables名称的前缀,那么这不会阻止引发exception的Tensorflow。 在这种情况下,只有tf.variable_scope上下文pipe理器会有效地改变你的var的名字。 或者如果你想重用这个variables,你应该在第二次创buildvar之前调用scope.reuse_variables()。

总之, tf.name_scope只是为在该范围内创build的所有张量(除了使用tf.get_variable创build的variables除外)添加前缀,并且tf.variable_scope为使用tf.get_variable创build的variables添加前缀。

在尝试通过创build一个简单示例来显示所有内容之前,我对理解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() 

在这里我创build了一个函数,它创build了一些variables和常量,并将它们分组在范围中(取决于我提供的types)。 在这个函数中,我也打印所有variables的名字。 之后,我执行graphics来获得结果值的值,并保存事件文件在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 

如果您打开TB,则会看到类似的模式(因为您看到bscope_name矩形之外): 在这里输入图像说明


这给你答案

现在你看到tf.variable_scope()为所有variables的名称(不pipe你如何创build它们),操作tf.variable_scope()tf.variable_scope()添加一个前缀。 另一方面, tf.name_scope()忽略使用tf.get_variable()创build的variables,因为它假定您知道哪个variables以及您想使用哪个范围。

关于共享variables的一个很好的文档告诉你

tf.variable_scope() :pipe理传递给tf.get_variable()名称的名称空间。

相同的文档提供了更多的细节,variables作用域如何工作以及何时有用。