首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tf.constant_initializer()与tf.global_variables_initializer()

tf.constant_initializer()与tf.global_variables_initializer()
EN

Stack Overflow用户
提问于 2019-08-10 02:34:05
回答 2查看 520关注 0票数 4

网站的以下代码中,tf.constant_initializer(0.)tf.global_variables_initializer()的作用是什么?为什么我们需要两个初始化器?

代码语言:javascript
复制
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.)呢?我们最好先不初始化mb,直到运行tf.global_variables_initializer().

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-10 11:40:17

让我们假设您想要创建一个Tensorflow图并从头开始训练它。因此,TF图中的所有tf.Variable都将被随机初始化。例如,在下面的代码中,tf.Variable将使用正态分布的值初始化。

代码语言:javascript
复制
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使用的确切值。因此:

代码语言:javascript
复制
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_initializertf.constant_initializer之间的区别,它们是完全不同的:

  • tf.global_variables_initializer是您执行的一种操作,用于初始化图中的所有变量。变量是使用tf.constant_initializertf.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
票数 2
EN

Stack Overflow用户

发布于 2019-08-10 07:06:57

两者是完全不同的。constant_initializer基本上是一个“指令”,一旦实际完成,就应该如何初始化变量。也就是说,它是否应该使用常量值,随机均匀值,随机正常值.

传递这一点并不意味着变量将在那时使用常量值进行初始化。如果不传递初始化器,get_variable将使用默认设置(我相信是glorot_uniform)。

另一方面,global_variables_initializer是一个op,一旦它在会话中运行,它实际上就会执行初始化--然后,它将调用在创建变量时传递给变量的初始化器。您总是需要运行一个op来初始化变量,因为如前所述,仅仅在构造函数中传递初始化函数并不能真正做任何事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57438856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档