为什么我们在Tensorflow中命名变量?

时间:2015-11-11 10:01:42

标签: python tensorflow

在某些地方,我看到了语法,其中变量用名称初始化,有时没有名称。例如:

# With name
var = tf.Variable(0, name="counter")

# Without
one = tf.constant(1)

命名变量var "counter"有什么意义?

4 个答案:

答案 0 :(得分:38)

name参数是可选的(您可以创建带或不带它的变量和常量),并且您在程序中使用的变量不依赖于它。姓名可以在以下几个方面提供帮助:

如果要保存或恢复变量(计算后可以save them to a binary file)。来自docs

  

默认情况下,它为每个使用Variable.name属性的值   变量

matrix_1 = tf.Variable([[1, 2], [2, 3]], name="v1")
matrix_2 = tf.Variable([[3, 4], [5, 6]], name="v2")
init = tf.initialize_all_variables()

saver = tf.train.Saver()

sess = tf.Session()
sess.run(init)
save_path = saver.save(sess, "/model.ckpt")
sess.close()

尽管如此,您还是将变量matrix_1matrix_2保存为文件中的v1v2

TensorBoard中也使用名称来很好地显示边缘名称。你甚至可以group them by using the same scope

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

答案 1 :(得分:13)

您可以将Python名称空间和TensorFlow名称空间想象为两个并行的Universe。 TensorFlow空间中的名称实际上是"真实的"属于任何TensorFlow变量的属性,而Python空间中的名称只是在脚本运行期间指向TensorFlow变量的临时指针。这就是为什么在保存和恢复变量时只使用TensorFlow名称的原因,因为脚本终止后Python命名空间不再存在,但Tensorflow命名空间仍然存在于保存的文件中。

答案 2 :(得分:6)

考虑以下用例代码及其输出

def f():
    a = tf.Variable(np.random.normal(), dtype = tf.float32, name = 'test123')

def run123():
    f()
    init = tf.global_variables_initializer()
    with tf.Session() as sess123:
        sess123.run(init)
        print(sess123.run(fetches = ['test123:0']))
        print(sess123.run(fetches = [a]))

run123()

输出:

  

[0.10108799]

     

NameError Traceback(最近一次调用   最后)in()        10打印(sess123.run(fetches = [a]))        11   ---> 12 run123()

     运行123()中的

        8 sess123.run(init)         9打印(sess123.run(fetches = [' test123:0']))   ---> 10打印(sess123.run(fetches = [a]))        11        12 run123()

     

NameError:name' a'未定义

f()范围中定义的' a',在其范围之外,即run123()中不可用。但是默认图表必须用某些东西引用它们,以便可以根据需要在各种范围内引用默认图形,这时它的名称就很方便了。

答案 3 :(得分:0)

实际上,从区分不同变量的角度来看,我们完全可以使用python名称(赋值符号的左侧,为避免混淆,我们将名称称为python name,例如{{1在下面的示例中)来命名变量。但是,在编程过程中,我们通常将python名称重新绑定到其他对象(即Tensorflow中的op),例如

v

首先,python名称v = tf.get_variable("v1", [3], initializer = tf.zeros_initializer) v = tf.get_variable("v2", [5], initializer = tf.zeros_initializer) 绑定张量形式的第一行(v)。然后,tf.get_variable("v1", [3], initializer = tf.zeros_initializer)从第二行(v)重新绑定了张量,并且不再绑定第一个张量。如果我们不给张量流属性名称tf.get_variable("v2", [5], initializer = tf.zeros_initializerv1,我们如何从第一行中识别张量?