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

jks*_*hin 11 python tensorflow

添加了TensorFlow用户的很多情况(此处此处)

init_op = tf.global_variables_initializer()
Run Code Online (Sandbox Code Playgroud)

在定义任何变量或操作之前,然后得到一个错误

Attempting to use uninitialized value
Run Code Online (Sandbox Code Playgroud)

这里有一个解释,但它没有提到底层tf.global_variables_initializer调用.它几乎复制TF API批发.这个问题集中在一些用户呼叫时仍然存在未初始化的值这一事实sess.run(init_op).示例代码和对什么tf.global_variables_initializer是伟大的分析.

jks*_*hin 14

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)
Run Code Online (Sandbox Code Playgroud)

打印出来的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>
Run Code Online (Sandbox Code Playgroud)

按原样运行上面的代码会导致上面提到的错误:

Attempting to use uninitialized value
Run Code Online (Sandbox Code Playgroud)

交换位置init_opa b c:

  a = tf.Variable(0)
  b = tf.Variable(0)
  c = tf.Variable(0)
  init_op = tf.global_variables_initializer()
Run Code Online (Sandbox Code Playgroud)

会让它发挥作用.


P-G*_*-Gn 5

The doc has actually a pretty detailed and useful section about variable initialization. You learn in particular that

Variable initializers must be run explicitly before other ops in your model can be run. The easiest way to do that is to add an op that runs all the variable initializers, and run that op before using the model. (..) Use tf.global_variables_initializer() to add an op to run variable initializers.

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

sess.run(my_var.initializer)
Run Code Online (Sandbox Code Playgroud)

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

如何了解所有变量?默认情况下,Variable创建a时,它将添加到tensorflow的GLOBAL_VARIABLES集合中。因此global_variables_initializer,基本上是遍历此集合的变量并调用其初始化程序。

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

sess.run(my_var.initializer)
Run Code Online (Sandbox Code Playgroud)