当需要全局变量初始化器(global_variables_initializer)时

26
import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
# model = tf.global_variables_initializer()
with tf.Session() as session:
        print("x = ", session.run(x)) 
        # session.run(model)
        print("y = ", session.run(y))

我无法理解何时需要使用global_variables_initializer(),在上述代码中,如果我们取消注释第4和7行,我可以执行代码并查看值。如果按原样运行,我会看到崩溃。

我的问题是它正在初始化哪些变量。x是一个不需要初始化的常量,y是一个未初始化但被用作算术操作的变量。

4个回答

23
tf.global_variables_initializer 是一个快捷方式,可以初始化所有的全局变量。它并非必要,您可以使用其他方法来初始化您的变量,或者在某些情况下,您根本不需要初始化它们。

除了变量之外的所有内容都不需要初始化(常量和占位符)。但是每个被使用的变量(即使它是常量)都应该被初始化。否则会出现错误,即使z只是一个只有一个数字的0维张量。

import tensorflow as tf
z = tf.Variable(4)
with tf.Session() as session:
        print(session.run(z)) 

我强调了使用的单词,因为如果您只有未运行的变量(或者没有运行依赖于它们的任何内容),则不需要初始化它们。


例如,这段代码将在没有任何问题的情况下执行,尽管它有2个变量和一个依赖于它们的操作。但是该程序不需要它们。

import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
z = tf.Variable(4)
a = y + z
with tf.Session() as session:
        print("x = ", session.run(x)) 

在我的代码中,变量没有像“z = tf.Variable(4)”这样的“显式初始化”。但是我使用了变量y,它是算术运算的输出,并且通过sess.run()进行评估。在这种情况下,需要“隐式初始化”,因此我们需要变量初始化吗? - Vinay
@Vinay,'no explicit initialization' 是什么意思?这不是初始化吗?tf.Variable(x + 5, name='y')是什么? - Salvador Dali
谢谢,你说得对。我一直在把那个语句当作算术运算而不是初始化。 - Vinay

6
文档中了解到(重点是我的):
调用tf.Variable()会在图中添加多个操作:
  • 一个保存变量值的变量(op)。
  • 一个初始化器op,它将变量设置为其初始值。实际上这是一个tf.assign op。
  • 初始化值的操作,例如示例中偏差变量的零操作,也会被添加到图中。
后来, 必须显式地运行变量初始化程序以便可以运行模型中的其他操作。最简单的方法是添加一个操作来运行所有变量初始化程序,并在使用模型之前运行该操作。 简而言之,global_variables_initializer从未被要求,Variable初始化是必需的。无论何时代码中有Variables,都必须首先对其进行初始化。helper global_variables_initializer初始化了之前声明的所有Variables,因此只是一种非常方便的方法。

4

tf.global_variables_initializer 会初始化 tf.global_variables() 列出的所有变量。在分布式环境中,计算图可能位于集群中不同的计算节点中,这样做非常有意义。

在这种情况下,tf.global_variables_initializer() 实际上就是 tf.variables_initializer(tf.global_variables()) 的别名,它将初始化放置计算图的所有计算节点中的所有变量。


3
只有在你从tensorflow会话运行中使用已声明的tf.Variabletf.placeholder时,才需要这样做。个人而言,我总是习惯性地运行tf.global_variables_initializer()。当运行tensorflow模型时,这几乎成为样板代码的一部分。
with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())

    # run model etc...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接