在某些地方,我看到了使用名称初始化变量的语法,有时没有名称。例如:
# With name
var = tf.Variable(0, name="counter")
# Without
one = tf.constant(1)
命名变量有什么意义var
"counter"
?
在某些地方,我看到了使用名称初始化变量的语法,有时没有名称。例如:
# With name
var = tf.Variable(0, name="counter")
# Without
one = tf.constant(1)
命名变量有什么意义var
"counter"
?
参数是可选的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_1
,matrix_2
它们在文件中另存v1
为v2
。
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')
您可以将 Python 命名空间和 TensorFlow 命名空间想象为两个平行的宇宙。TensorFlow 空间中的名称实际上是属于任何 TensorFlow 变量的“真实”属性,而 Python 空间中的名称只是在脚本运行期间指向 TensorFlow 变量的临时指针。这就是为什么在保存和恢复变量时只使用 TensorFlow 名称的原因,因为 Python 命名空间在脚本终止后不再存在,但 TensorFlow 命名空间仍然存在于您保存的文件中。
考虑以下用例代码及其输出
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() 中。但是默认图必须用一些东西来引用它们,以便可以根据需要跨各种范围引用默认图,这就是它的名字派上用场的时候。
事实上,从区分不同变量的角度,我们完全可以使用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 属性名称v1
和v2
,我们如何从第一行识别张量?