Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference of name scope and a variable scope in tensorflow?

Tags:

tensorflow

What's the differences between these functions?

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.

like image 624
Xiuyi Yang Avatar asked Mar 10 '16 14:03

Xiuyi Yang


People also ask

What is variable scope in Tensorflow?

Variable scope allows you 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. The Variable Scope works as expected when the Eager Execution is Disabled.

What is name scope in Tensorflow?

Graph-based Neural Structured Learning in TFX. This context manager pushes a name scope, which will make the name of all operations added within it have a prefix. For example, to define a new Python op called my_op : def my_op(a, b, c, name=None): with tf.

What types of variable scopes do you know?

There are mainly two types of variable scopes: Local Variables. Global Variables.


1 Answers

Let's begin by a short introduction to variable sharing. It is a mechanism in TensorFlow that allows for sharing variables accessed in different parts of the code without passing references to the variable around.

The method tf.get_variable can be used with the name of the variable as the argument to either create a new variable with such name or retrieve the one that was created before. This is different from using the tf.Variable constructor which will create a new variable every time it is called (and potentially add a suffix to the variable name if a variable with such name already exists).

It is for the purpose of the variable sharing mechanism that a separate type of scope (variable scope) was introduced.

As a result, we end up having two different types of scopes:

  • name scope, created using tf.name_scope
  • variable scope, created using tf.variable_scope

Both scopes have the same effect on all operations as well as variables created using tf.Variable, i.e., the scope will be added as a prefix to the operation or variable name.

However, name scope is ignored by tf.get_variable. We can see that in the following example:

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 

The only way to place a variable accessed using tf.get_variable in a scope is to use a variable scope, as in the following example:

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 

This allows us to easily share variables across different parts of the program, even within different name scopes:

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 

UPDATE

As of version r0.11, op_scope and variable_op_scope are both deprecated and replaced by name_scope and variable_scope.

like image 52
Andrzej Pronobis Avatar answered Oct 19 '22 04:10

Andrzej Pronobis