翻译自:https://stackoverflow.com/questions/35919020/whats-the-difference-of-name-scope-and-a-variable-scope-in-tensorflow

问题:下面这几个函数的区别是什么?

tf.variable_op_scope(values, name, default_name, initializer=None)
Returns a context manager for defining an op
that creates variables. This context manager validates that the given values
are from the same graph, ensures that that graph is the default graph, and
pushes a name scope and a variable scope.

tf.op_scope(values, name, default_name=None)
Returns a context manager for use when
defining a Python op. This context manager validates that the given values are
from the same graph, ensures that that graph is the default graph, and pushes a
name scope.

tf.name_scope(name)
Wrapper for Graph.name_scope() using the
default graph. See Graph.name_scope() for more details.

tf.variable_scope(name_or_scope,
reuse=None, initializer=None)
Returns a context for variable scope. Variable
scope allows to create new variables and to share already created ones while
providing checks to not create or share by accident. For details, see the
Variable Scope How To, here we present only a few basic examples.

回答1:

首先简单介绍一下变量共享(variable sharing)。这是Tensorflow中的一种机制,它允许在代码的不同位置可以访问到共享变量(在不需要传递变量引用的情况下)。tf.get_variable方法可以将变量的名字作为参数,以创建具有该名称的新变量或者如果已经存在这个变量了,就取回这个变量。这与 tf.Variable是不同的。每次调用 tf.Variable都会创建一个新的变量(如果具有此名称的变量已经存在,则可能向变量名添加后缀)。针对共享变量机制,引进了scope (variable scope) 。

结果,我们有2中不同的scopes类型:

这两个scopes在所有的操作(operation)和使用tf.Variable创建的变量上都有相同的作用。

然而,tf.get_variable会忽略name scope,我们可以看看如下的例子:

with tf.name_scope("my_scope"):
v1 = tf.get_variable("var1", [1], dtype=tf.float32)
v2 = tf.Variable(1, name="var2", dtype=tf.float32)
a = tf.add(v1, v2) print(v1.name) # var1:0
print(v2.name) # my_scope/var2:0
print(a.name) # my_scope/Add:0

在一个scope中使用tf.get_variable来使得变量可以被访问唯一方法就是使用一个variable scope,例子如下:

with tf.variable_scope("my_scope"):
v1 = tf.get_variable("var1", [1], dtype=tf.float32)
v2 = tf.Variable(1, name="var2", dtype=tf.float32)
a = tf.add(v1, v2) print(v1.name) # my_scope/var1:0
print(v2.name) # my_scope/var2:0
print(a.name) # my_scope/Add:0

这可以使得我们在程序的不同地方可以很容易的共享变量,甚至在不同的name scope中:

with tf.name_scope("foo"):
with tf.variable_scope("var_scope"):
v = tf.get_variable("var", [1])
with tf.name_scope("bar"):
with tf.variable_scope("var_scope", reuse=True):
v1 = tf.get_variable("var", [1])
assert v1 == v
print(v.name) # var_scope/var:0
print(v1.name) # var_scope/var:0

更新:

Tensorflow版本r0.11之后,op_scope 和 variable_op_scope都被弃用了,替代的是op_scope 和 variable_op_scope

回答2:

举了一个例子,并将其可视化。

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()

输出结果如下:

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中可视化如下:

从上面的可以看出来,tf.variable_scope()为所有变量(不管你是怎么创建的)、操作(ops)、常量(constant)添加一个前缀,而tf.name_scope()会忽视使用tf.get_variable()创建的变量,因为它假设你知道你使用的变量位于哪个scope中。

Sharing variables文档中告诉你:

tf.variable_scope(): Manages namespaces for names passed to tf.get_variable().

更详细的可以查看官方文档。

[翻译] Tensorflow中name scope和variable scope的区别是什么的更多相关文章

  1. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  2. Tensorflow中的run()函数

    1 run()函数存在的意义 run()函数可以让代码变得更加简洁,在搭建神经网络(一)中,经历了数据集准备.前向传播过程设计.损失函数及反向传播过程设计等三个过程,形成计算网络,再通过会话tf.Se ...

  3. tensorflow变量作用域(variable scope)

    举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时候共享变量会无比复杂. 官网给了一个case,当创建两层卷积的过滤器时,每输入一次图片就会创建一次过滤器对应的变量,但是我们希望 ...

  4. tensorflow variable scope 变量命名空间和变量共享

    import tensorflow as tf def f(): var = tf.Variable(initial_value=tf.random_normal(shape=[2])) return ...

  5. [TensorBoard] Name & Variable scope

    TF有两个scope, 一个是name_scope一个是variable_scope 第一个程序: with tf.name_scope("hello") as name_scop ...

  6. [Ruby] Ruby Variable Scope

    Scope defines where in a program a variable is accessible. Ruby has four types of variable scope, lo ...

  7. PHP Variable Scope

    原文: https://phppot.com/php/variable-scope-in-php/ Last modified on March 24th, 2017 by Vincy. ------ ...

  8. tensorflow中常量(constant)、变量(Variable)、占位符(placeholder)和张量类型转换reshape()

    常量 constant tf.constant()函数定义: def constant(value, dtype=None, shape=None, name="Const", v ...

  9. tensorflow中slim模块api介绍

    tensorflow中slim模块api介绍 翻译 2017年08月29日 20:13:35   http://blog.csdn.net/guvcolie/article/details/77686 ...

随机推荐

  1. protobuf的下载、编译和使用

    一 背景 工作中临时需要使用 protobuf v3.0.2 做消息格式转换,折腾了很久才搞定,这里特意做一个记录. 二 准备工作 全程使用的电脑为公司的win7 64位旗舰版,已经预先安装VS201 ...

  2. 用Canvas写一个简单的游戏--别踩白块儿

    第一次写博客也不知怎么写,反正就按照我自己的想法来吧!怎么说呢?还是不要扯那些多余的话了,直接上正题吧! 第一次用canvas写游戏,所以挑个简单实现点的来干:别踩白块儿,其他那些怎么操作的那些就不用 ...

  3. System V IPC 之共享内存

    IPC 是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 ...

  4. React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(二)

    上一篇杂七杂八说了下express部分的,现在开始进入正题. 接下去的顺序,就是项目从零开始的顺序(思路方向). [actions定义] 如图,目录页,有4部分的内容,所以以下几个actions是需要 ...

  5. 用C语言实现QQ刷屏

    我在百度传课上录制了一个用C语言实现刷屏的视频,有兴趣的可以移步这边:https://chuanke.baidu.com/6658388-238008.html

  6. linux 50个常用命令

    1.ls命令 ls是list的缩写,常用命令为ls(显示出当前目录列表),ls -l(详细显示当前目录列表),ls -lh(人性化的详细显示当前目录列表),ls -a(显示出当前目录列表,包含隐藏文件 ...

  7. 《招一个靠谱的移动开发》iOS面试题及详解(上篇)

    以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...

  8. java8-Stream之数值流

    在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱.虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面.Java8引入了3个原始类型特化流接口来解决这个问 ...

  9. jquery 表双击某行时,取出某行中各列的数值.

      <script> $(function () { $("tr").dblclick(function () { var txt = $("table tr ...

  10. 码农、黑客和2B程序员之间的区别

    码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L<<32 ...