TF有两个scope, 一个是name_scope一个是variable_scope

第一个程序:

with tf.name_scope("hello") as name_scope:
arr1 = tf.get_variable("arr1", shape=[2,10],dtype=tf.float32) print name_scope # "hello/" 
print arr1.name # arr1:0 
print "scope_name:%s " % tf.get_variable_scope().original_name_scope # 空

第二个程序:

with tf.variable_scope("hello") as variable_scope:
arr1 = tf.get_variable("arr1", shape=[2, 10], dtype=tf.float32) print variable_scope # 返回的是一个 op对象
print variable_scope.name # 打印出变量空间名字
print arr1.name
print tf.get_variable_scope().original_name_scope
# tf.get_variable_scope() 获取的就是variable_scope with tf.variable_scope("xixi") as v_scope2:
print tf.get_variable_scope().original_name_scope
# tf.get_variable_scope() 获取的就是v _scope2

输出为:

<tensorflow.python.ops.variable_scope.VariableScope object at 0x7fbc09959210>
hello
hello/arr1:0
hello/
hello/xixi/

第三个程序:

with tf.name_scope("name1"):
with tf.variable_scope("var1"):
w = tf.get_variable("w",shape=[2])
res = tf.add(w,[3]) print w.name
print res.name 输出为:
var1/w:
name1/var1/Add:0

可以看出:variable scopename scope都会给opname加上前缀

对比三个个程序可以看出:

  • name_scope对 get_variable()创建的变量 的名字不会有任何影响,而创建的op会被加上前缀.
  • tf.get_variable_scope() 返回的只是 variable_scope,不管 name_scope.所以以后我们在使用tf.get_variable_scope().reuse_variables() 时可以无视name_scope

其它

with tf.name_scope("scope1") as scope1:
with tf.name_scope("scope2") as scope2:
print scope2
#输出:scope1/scope2/
import tensorflow as tf
with tf.variable_scope("scope1") as scope1:
with tf.variable_scope("scope2") as scope2:
print scope2.name
#输出:scope1/scope2

name_scope可以用来干什么

Background: 典型的 TensorFlow 可以有数以千计的节点,如此多而难以一下全部看到,甚至无法使用标准图表工具来展示。

Solution: 为简单起见,我们为 op/tensor名 划定范围,并且可视化把该信息用于在图表中的节点上定义一个层级。默认情况下, 只有顶层节点会显示。

下面这个例子使用tf.name_scope在hidden命名域下定义了三个操作: 【好例子】

import tensorflow as tf

with tf.name_scope('hidden') as scope:
a = tf.constant(5, name='alpha')
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
b = tf.Variable(tf.zeros([1]), name='biases')
print a.name  # hidden/alpha 
print W.name  # hidden/weights 
print b.name  # hidden/biases 

name_scope 是给op_name加前缀

variable_scope是给get_variable()创建的变量的名字加前缀。

tf.variable_scope有时也会处理命名冲突

import tensorflow as tf
def test(name=None):
with tf.variable_scope(name, default_name="scope") as scope:
w = tf.get_variable("w", shape=[2, 10]) test()
test()
ws = tf.trainable_variables()
for w in ws:
print(w.name) #scope/w:0
#scope_1/w:0
#可以看出,如果只是使用default_name这个属性来创建variable_scope
#的时候,会处理命名冲突

其它

  • tf.name_scope(None) 有清除name scope的作用
import tensorflow as tf
with tf.name_scope("hehe"):
w1 = tf.Variable(1.0)
with tf.name_scope(None):
w2 = tf.Variable(2.0)
print(w1.name)
print(w2.name) #hehe/Variable:0
#Variable:0

variable_scope可以用来干什么

variable_scope 用来管理 variable 详见variable_scope

总结

简单来看 
1. 使用tf.Variable()的时候,tf.name_scope()tf.variable_scope() 都会给 Variable 和 op 的 name属性加上前缀。 
2. 使用tf.get_variable()的时候,tf.name_scope()就不会给 tf.get_variable()创建出来的Variable加前缀。

[TensorBoard] Name & Variable scope的更多相关文章

  1. [翻译] Tensorflow中name scope和variable scope的区别是什么

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

  2. [Ruby] Ruby Variable Scope

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

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

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

  4. PHP Variable Scope

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

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

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

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

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

  7. JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

    在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...

  8. Python Variable Scope

    Python中的变量的作用域有时会让像我这样的初学者很头疼. 其实只需要掌握以下两点: 1. Python能够改变变量作用域的代码段是def.class.lamda;    而if/elif/else ...

  9. python variable scope 变量作用域

    python 中变量的作用域经常让我感到很迷 In Python, on the other hand, variables declared in if-statements, for-loop b ...

随机推荐

  1. 微信企业号开发之weixin://preInjectJSBridge/fail

    最近几天遇到个奇怪的问题,目前只有在Andriod平台上出现:weixin://preInjectJSBridge/fail 不止我一个人遇到这个问题,群里也有好几个问了这个问题.这个问题直接导致我们 ...

  2. Java 多线程 interrupt方法

    interrupt 下面是interrupt方法的文档的一部分: * <p> If this thread is blocked in an invocation of the {@lin ...

  3. CocosCreator 场景转换API

    一.CocosCreator场景的切换API: cc.director.loadScene( ‘场景名称’);//场景切换必须使用的API 通过场景名称进行加载场景时,常用的就是上边的API,但是版本 ...

  4. Xshell 连接 CentOS 7 与 Ubuntu Server

    操作系统:windows 7 应用软件:Ware Workstation & Xshell 5 Linux:CentOS 7 Minimal & Ubuntu Server 16 == ...

  5. SVN Error:请求的名称有效并且在数据库中找到,但是它没有相关的正确的数据来被解析

    同事安装配置完Svn后一直down不下来文件,报错内容如下: Administrator 18:07:27  Checkout from https:/svn/web, revision HEAD, ...

  6. 在线检测域名或者ip的端口是否开放(http://coolaf.com/tool/port)

    http://coolaf.com/tool/port

  7. ERROR: Field * doesn't have a default value

    ERROR: Field 'status' doesn't have a default value 今天做项目,在插入数据时出现了这个从没遇到的异常,看了98%的异常分析都是针对组件id出现了类似的 ...

  8. excel表格 xls、xlsx 读取

    public static void main(String[] args) throws Exception { // getdslContext(); String file = "F: ...

  9. 【C#】详解C#事件

    目录结构: contents structure [+] 事件基本介绍 定义事件类型 定义事件成员 定义引发事件的方法 以线程安全的方式引发事件 登记事件关注 揭秘事件 显式实现事件 为什么需要显式实 ...

  10. swoole+Redis实现实时数据推送

    <?php /** * *************************************** * 单进程保护 * * ********************************* ...