这些功能之间有什么区别?
tf.variable_op_scope(values,name,default_name,initializer = None)返回用于定义创建变量的op的上下文管理器 . 此上下文管理器验证给定值是否来自同一图,确保该图是默认图,并推送名称范围和变量范围 .
tf.op_scope(values,name,default_name = None)返回在定义Python操作时使用的上下文管理器 . 此上下文管理器验证给定值是否来自同一图,确保该图是默认图,并推送名称范围 .
tf.name_scope(name)Graph.name_scope()的包装器使用默认图形 . 有关更多详细信息,请参见Graph.name_scope() .
tf.variable_scope(name_or_scope,reuse = None,initializer = None)返回变量范围的上下文 . 变量范围允许创建新变量并共享已创建的变量,同时提供不会意外创建或共享的检查 . 有关详细信息,请参阅变量范围操作方法,此处我们仅提供一些基本示例 .
7 回答
让我们简单一点:只需使用
tf.variable_scope
. Quoting a TF developer,:除了
variable_scope
的功能基本上扩展到了name_scope
之外,考虑一下它们如何在一起玩得不那么好:坚持
variable_scope
只会因为这种不兼容而避免一些麻烦 .至于API r0.11,
op_scope
和variable_op_scope
都是deprecated .name_scope
和variable_scope
可以嵌套:您可以将它们视为两个组:
variable_op_scope
和op_scope
将一组变量作为输入,用于创建操作 . 区别在于它们如何影响tf.get_variable
的变量创建:请注意两个示例中变量
v
的名称 .同样适用于
tf.name_scope
和tf.variable_scope
:您可以在tutorial中阅读有关变量范围的更多信息 . 类似的问题是Stack Overflow上的asked before .
让我们从变量共享的简短介绍开始 . 它是
TensorFlow
中的一种机制,允许共享在代码的不同部分中访问的变量,而不传递对变量的引用 .方法tf.get_variable可以与变量的名称一起用作参数,以创建具有此类名称的新变量或检索之前创建的变量 . 这与使用tf.Variable构造函数不同,后者将在每次调用时创建一个新变量(如果已存在具有此类名称的变量,则可能会为变量名称添加后缀) .
出于可变共享机制的目的,引入了单独类型的范围(变量范围) .
因此,我们最终有两种不同类型的范围:
名称范围,使用tf.name_scope创建
变量范围,使用tf.variable_scope创建
两个范围对所有操作以及使用
tf.Variable
创建的变量具有相同的效果,即范围将作为操作或变量名称的前缀添加 .但是,
tf.get_variable
会忽略名称范围 . 我们可以在以下示例中看到:在范围中放置使用
tf.get_variable
访问的变量的唯一方法是使用变量范围,如下例所示:这使我们可以轻松地在程序的不同部分共享变量,甚至在不同的名称范围内:
更新
As of version r0.11, op_scope and variable_op_scope are both deprecated and replaced by name_scope and variable_scope.
命名空间是一种以分层方式组织变量和运算符名称的方法(例如“scopeA / scopeB / scopeC / op1”)
tf.name_scope为默认图形中的运算符创建名称空间 .
tf.variable_scope在默认图中为变量和运算符创建名称空间 .
tf.op_scope与
tf.name_scope
相同,但是对于创建指定变量的图形 .tf.variable_op_scope与
tf.variable_scope
相同,但是对于创建指定变量的图形 .上述来源的链接有助于消除此文档问题的歧义 .
This example表明所有类型的作用域都为变量和运算符定义了名称空间,但有以下区别:
由
tf.variable_op_scope
或tf.variable_scope
定义的范围与
tf.get_variable
兼容(它忽略了另外两个范围)tf.op_scope
和tf.variable_op_scope
只需从指定变量列表中选择一个图形即可创建范围 . 除此之外,他们的行为相应于tf.name_scope
和tf.variable_scope
tf.variable_scope
和variable_op_scope
添加指定或默认初始值设定项 .variable_op_scope和op_scope现已弃用,根本不应使用 .
关于其他两个,在我尝试通过创建一个可视化的东西之前,我也很难理解variable_scope和name_scope之间的区别(它们看起来几乎相同)简单的例子:
在这里,我创建了一个函数,它创建了一些变量和常量,并在范围内对它们进行分组(取决于我提供的类型) . 在这个函数中,我还打印了所有变量的名称 . 之后,我执行图表以获取结果值的值并保存事件文件以在TensorBoard中调查它们 . 如果你运行它,你将得到以下内容:
如果打开TensorBoard,您会看到类似的模式(如您所见
b
在scope_name
矩形之外):This gives you the answer :
现在你看到
tf.variable_scope()
为所有变量的名称添加了一个前缀(无论你如何创建它们),ops,常量 . 另一方面,tf.name_scope()
忽略使用tf.get_variable()
创建的变量,因为它假定您知道要使用哪个变量以及在哪个范围内 .关于Sharing variables的好文档告诉你
相同的文档提供了有关变量范围如何工作以及何时有用的更多详细信息 .
从tensorflow文档的本页的最后一节开始:Names of ops in tf.variable_scope()