tf.global_variables_initializer()在幕后做了什么?

时间:2017-07-12 03:33:13

标签: python tensorflow

TensorFlow用户添加

的情况很多(herehere
init_op = tf.global_variables_initializer()

在定义任何变量或操作之前,然后按

的方式获取错误
Attempting to use uninitialized value

有一个解释here,但它没有提到潜在的tf.global_variables_initializer来电。它几乎复制TF API批发。这个问题集中在以下事实:当某些用户呼叫sess.run(init_op)时,仍然存在未初始化的值。示例代码和对tf.global_variables_initializer将会很棒的分析。

2 个答案:

答案 0 :(得分:11)

TensorFlow API在tf.global_variables_initializer上有一个非常短的部分。它只是提到:

  

这只是variable_initializer(global_variables())的快捷方式。

将其追踪到tf.variables_initializer,我们可以看到此功能的用法是这样的:

tf.variables_initializer(var_list, name='init')

这意味着我们将tf.global_variables作为var_list传递给tf.variables_initializer。如果我们在调用tf.global_variables_initializer之前没有定义任何变量,var_list基本上是空的。下面的代码说明了这一点:

import tensorflow as tf

with tf.Graph().as_default():
  # Nothing is printed
  for v in tf.global_variables():
    print v

  init_op = tf.global_variables_initializer()
  a = tf.Variable(0)
  b = tf.Variable(0)
  c = tf.Variable(0)

  # 3 Variables are printed here
  for v in tf.global_variables():
    print v

  with tf.Session() as sess:
    sess.run(init_op)
    print sess.run(a)

打印出来的3个变量是这样的:

<tf.Variable 'Variable:0' shape=() dtype=int32_ref>
<tf.Variable 'Variable_1:0' shape=() dtype=int32_ref>
<tf.Variable 'Variable_2:0' shape=() dtype=int32_ref>

按原样运行上述代码会导致出现上述错误:

Attempting to use uninitialized value

init_op的位置换成a b c之后:

  a = tf.Variable(0)
  b = tf.Variable(0)
  c = tf.Variable(0)
  init_op = tf.global_variables_initializer()

会使它发挥作用。

答案 1 :(得分:5)

该文档实际上非常详细且有用section about variable initialization。你特别了解

  

必须先运行变量初始值设定项,然后才能运行模型中的其他操作。最简单的方法是添加一个运行所有变量初始值设定项的op,并在使用模型之前运行该op。 (..)使用tf.global_variables_initializer()添加运行变量初始值设定项的操作。

所以基本上tf.global_variables_initializer()遍历所有变量,然后调用

sess.run(my_var.initializer)

tf.global_variables_initializer()会立即自动执行此操作。此功能可以节省时间,但从技术上讲,您不会 调用它,并可以通过其他方式初始化变量(最常见的示例:从文件恢复权重)。

它如何了解所有变量?默认情况下,创建Variable时,会将其添加到tensorflow的GLOBAL_VARIABLES集合中。所以global_variables_initializer基本上是遍历这个集合的变量并调用它们的初始值。

但是Variable允许您选择要放入的集合。如果您从GLOBAL_VARIABLES中排除变量,则创建的变量将 not tf_global_variables_initializer()初始化:

import tensorflow as tf

x = tf.Variable(0)
my_vars = []
y = tf.Variable(0, collections=my_vars)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run() # does not initialize y!
print(x.eval())
# 0
print(y.eval())
# FailedPreconditionError: Attempting to use uninitialized value Variable_2