41

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

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

# Without
one = tf.constant(1)

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

4

4 回答 4

47

参数是可选的name(你可以创建有或没有它的变量和常量),你在程序中使用的变量不依赖于它。名称在几个地方可能会有所帮助:

当您想要保存或恢复变量时(您可以在计算后将它们保存到二进制文件中)。来自文档

默认情况下,它使用每个变量的 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 中还使用名称来很好地显示边缘的名称。您甚至可以使用相同的范围对它们进行分组

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')
于 2015-11-11T10:10:40.913 回答
18

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

于 2016-05-07T05:21:29.440 回答
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 (last last call last) in () 10 print(sess123.run(fetches = [a])) 11 ---> 12 run123()

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

NameError:名称“a”未定义

在 f() 的范围内定义的“a”在其范围之外不可用,即在 run123() 中。但是默认图必须用一些东西来引用它们,以便可以根据需要跨各种范围引用默认图,这就是它的名字派上用场的时候。

于 2017-09-26T06:56:16.443 回答
0

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

v = tf.get_variable("v1", [3], initializer = tf.zeros_initializer)
v = tf.get_variable("v2", [5], initializer = tf.zeros_initializer)

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

于 2018-07-19T07:46:09.757 回答