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

翻译自: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().

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

时间: 2024-09-30 04:34:37

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

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

http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 """ 4 ------------------------------------------------------------------------------- 5 Function: 6 [整理

ValueError: Attempt to reuse RNNCell <tensorflow.contrib.rnn.python.ops.core_rnn_cell_impl.BasicLSTMCell object at 0x7f1a3c448390> with a different variable scope than its first use.解决方法

最近在做生成电视剧本小项目,遇到以下报错 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-16-a2d9a7091ca5> in <module>() 10 input_data_shape = tf.shape(input_text) 11 cell, ini

[Ruby] Ruby Variable Scope

Scope defines where in a program a variable is accessible. Ruby has four types of variable scope, local,global, instance and class. In addition, Ruby has one constant type. Each variable type is declared by using a special character at the start of t

如何在Scope中利用keyword来使自己的Scope在聚合Scope中展示自己

在前面的文章"Scopes 关键词 (keyword)及departments探讨(英文视频)"中,我们已经对Scope中的keyword做了一些基本的介绍.但是我们没有相应的教程.在这篇文章中,我们将通过youku Scope来介绍如何使用keyword从而使得一个Scope在不同的聚合Scope中来得到不同的呈现. 如果大家对如何开发Scope还不是很熟的话,请参阅我的教程"在Ubuntu OS上创建一个dianping Scope (Qt JSON)".如果大

tensorflow中的共享变量(sharing variables)

为什么要使用共享变量? 当训练复杂模型时,可能经常需要共享大量的变量.例如,使用测试集来测试已训练好的模型性能表现时,需要共享已训练好模型的变量,如全连接层的权值. 而且我们还会遇到以下问题: 比如,我们创建了一个简单的图像滤波器模型.如果只使用tf.Variable,那么我们的模型可能如下 def my_image_filter(input_images): conv1_weights = tf.Variable(tf.random_normal([5, 5, 32, 32]), name="

JavaScript的Function Scope and Lexical Scope

原贴地址:http://pierrespring.com/2010/05/11/function-scope-and-lexical-scoping/ 个人觉得写得不错,简单地搬运,如有错误,请指正. Wikipedia defines Scope as follows: Tipically, scope is used to define the extent of information hiding--that is, the visibility or accessibility of

第二十二节,TensorFlow中RNN实现一些其它知识补充

一 初始化RNN 上一节中介绍了 通过cell类构建RNN的函数,其中有一个参数initial_state,即cell初始状态参数,TensorFlow中封装了对其初始化的方法. 1.初始化为0 对于正向或反向,第一个cell传入时没有之前的序列输出值,所以需要对其进行初始化.一般来讲,不用刻意取指定,系统会默认初始化为0,当然也可以手动指定其初始化为0. initial_state = lstm_cell.zero_state(batch_size, dtype=tf.float32) 2.初

第二十二节,TensorFlow中的图片分类模型库slim的使用

Google在TensorFlow1.0,之后推出了一个叫slim的库,TF-slim是TensorFlow的一个新的轻量级的高级API接口.这个模块是在16年新推出的,其主要目的是来做所谓的"代码瘦身".它类似我们在TensorFlow模块中所介绍的tf.contrib.lyers模块,将很多常见的TensorFlow函数进行了二次封装,使得代码变得更加简洁,特别适用于构建复杂结构的深度神经网络,它可以用了定义.训练.和评估复杂的模型. 这里我们为什么要过来介绍这一节的内容呢?主要是

TensorFlow中的通信机制——Rendezvous(一)本地传输

背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在TensorFlow源码中我们经常能看到一个奇怪的词--Rendezvous.如果从仔细统计该单词出现的频率和模块,你会发现无论在单机还是分布式,无论在core目录还是contrib目录都存在它的身影,所涉及的模块非常多.Rendezvous是一个法语单词,发音也比较特殊,一般直译为"约会.相会.会和",而在TensorFlow中,Rendezvous是用来完成消