在这网站的以下代码中,tf.constant_initializer(0.)和tf.global_variables_initializer()的作用是什么?为什么我们需要两个初始化器?
import tensorflow as tf
### build the graph
## first set up the parameters
m = tf.get_variable("m", [], initializer=tf.constant_initializer(0.))
b = tf.get_variable("b", [], initializer=tf.constant_initializer(0.))
init = tf.global_variables_initializer()
## then set up the computations
input_placeholder = tf.placeholder(tf.float32)
output_placeholder = tf.placeholder(tf.float32)
x = input_placeholder
y = output_placeholder
y_guess = m * x + b
loss = tf.square(y - y_guess)
## finally, set up the optimizer and minimization node
optimizer = tf.train.GradientDescentOptimizer(1e-3)
train_op = optimizer.minimize(loss)
### start the session
sess = tf.Session()
sess.run(init)最初的post I链接有一个解释:
答案在于会话和图表之间的分裂。我们已经将get_variable的初始化器属性设置为指向我们的const_init_node,但这只是在图中的节点之间添加了一个新的连接。我们还没有对异常的根做任何处理:与变量节点相关联的内存(它存储在会话中,而不是图形!)仍然设置为“null”。我们需要会话告诉const_init_node实际更新变量。
..。在这种情况下,为什么我们需要tf.constant_initializer(0.)呢?我们最好先不初始化m和b,直到运行tf.global_variables_initializer().
发布于 2019-08-10 11:40:17
让我们假设您想要创建一个Tensorflow图并从头开始训练它。因此,TF图中的所有tf.Variable都将被随机初始化。例如,在下面的代码中,tf.Variable将使用正态分布的值初始化。
tf.reset_default_graph()
x = tf.get_variable(name="random", shape=[1, 5] initializer=tf.random_normal_initializer())
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(x))
# [[-1.1984633 -0.42527035 -1.020795 -0.7023787 0.22350429]]现在,让我们假设您再次希望创建一个TF图,并从零开始训练它。但是,现在,由于一些奇怪的原因,您知道要为图中的某些tf.Variable使用的确切值。因此:
tf.reset_default_graph()
x = tf.get_variable(name="constant", shape=[1,5], initializer=tf.constant_initializer(value=[[1,2,3,4,5]]))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(x))
# [[1. 2. 3. 4. 5.]]你用你想要的值初始化那些tf.Variable。
至于tf.global_variables_initializer和tf.constant_initializer之间的区别,它们是完全不同的:
tf.global_variables_initializer是您执行的一种操作,用于初始化图中的所有变量。变量是使用tf.constant_initializer、tf.random_normal_initializer还是tf.glorot_uniform_initializer初始化并不重要。您只需将该操作传递给tf.Session,以便对图形变量进行初始化。tf.constant_initializer只是您传递给图形的tf.Variable的一个初始化器。然后,当tf.Session运行操作tf.global_variables_initializer时,TF图将使用tf.constant_initializer来使用提供的常量值初始化相应的tf.Variable。发布于 2019-08-10 07:06:57
两者是完全不同的。constant_initializer基本上是一个“指令”,一旦实际完成,就应该如何初始化变量。也就是说,它是否应该使用常量值,随机均匀值,随机正常值.
传递这一点并不意味着变量将在那时使用常量值进行初始化。如果不传递初始化器,get_variable将使用默认设置(我相信是glorot_uniform)。
另一方面,global_variables_initializer是一个op,一旦它在会话中运行,它实际上就会执行初始化--然后,它将调用在创建变量时传递给变量的初始化器。您总是需要运行一个op来初始化变量,因为如前所述,仅仅在构造函数中传递初始化函数并不能真正做任何事情。
https://stackoverflow.com/questions/57438856
复制相似问题