Python tf.global_variables_initializer()在引擎盖下做什么?

Python tf.global_variables_initializer()在引擎盖下做什么?,python,tensorflow,Python,Tensorflow,TensorFlow用户添加 init_op=tf.global_variables_initializer() 在定义任何变量或操作,然后根据 Attempting to use uninitialized value 有一种解释,但它没有提到底层的tf.global\u variables\u初始值设定项调用。它几乎是大规模复制。这个问题的重点是,当一些用户调用sess.run(init_op)时,仍然存在未初始化的值。示例代码和对什么tf.global\u variables\u in

TensorFlow用户添加

init_op=tf.global_variables_initializer()
在定义任何变量或操作,然后根据

Attempting to use uninitialized value

有一种解释,但它没有提到底层的
tf.global\u variables\u初始值设定项调用。它几乎是大规模复制。这个问题的重点是,当一些用户调用
sess.run(init_op)
时,仍然存在未初始化的值。示例代码和对什么
tf.global\u variables\u initializer
的分析将非常有用。

TensorFlow API有一个非常简短的部分。它只提到:

这只是
变量\初始值设定项(全局变量())
的快捷方式

追溯到,我们可以看到该函数的用法如下:

tf.variables\u初始值设定项(var\u list,name='init')

这意味着我们将
tf.global\u variables
作为
var\u列表
简单地传递到
tf.variables\u初始值设定项
。如果我们在调用
tf.global\u variables\u初始值设定项之前没有定义任何变量,
var\u list
基本上是空的。下面的代码说明了这一点:

将tensorflow导入为tf
使用tf.Graph()作为默认值():
#什么也没印
对于tf.global_变量()中的v:
印刷品
init_op=tf.global_variables_initializer()
a=tf.变量(0)
b=tf.变量(0)
c=tf.变量(0)
#这里打印了3个变量
对于tf.global_变量()中的v:
印刷品
使用tf.Session()作为sess:
sess.run(初始化操作)
打印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>
init_op
的位置切换到
a b c
之后:

a=tf.变量(0)
b=tf.变量(0)
c=tf.变量(0)
init_op=tf.global_variables_initializer()

将使它工作。

该文件实际上有一个非常详细和有用的。你特别了解到

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

所以基本上
tf.global\u variables\u initializer()
检查所有变量,并调用

sess.run(my_var.initializer)
tf.global\u variables\u initializer()
立即自动执行此操作。此函数可以节省时间,但从技术上讲,您不必调用它,并且可以通过其他方式初始化变量(最常见的示例:从文件恢复权重)

它如何了解所有变量?默认情况下,创建
变量
时,会将其添加到tensorflow的
全局变量
集合中。因此,
global\u variables\u initializer
基本上是迭代这个集合的变量并调用它们的initializer

但是,
Variable
允许您选择要将其放入的集合。如果从
GLOBAL\u VARIABLES
中排除变量,则创建的变量将不会由
tf\u GLOBAL\u VARIABLES\u初始值设定项()初始化:

将tensorflow导入为tf
x=tf.变量(0)
my_vars=[]
y=tf.Variable(0,collections=my_vars)
sess=tf.InteractiveSession()
tf.global_variables_initializer().run()#不初始化y!
打印(x.eval())
# 0
打印(y.eval())
#FailedPremissionError:尝试使用未初始化的值变量_2

此问题可能重复的内容与您链接的内容不同。添加了上面这个问题的焦点。我正在使用tf 1.15和
tf。变量\初始值设定项
不再可用。相反,
tf.global\u variables\u initializer()
等于
tf.initialize\u variables(var\u list=tf.global\u variables())
sess.run(my_var.initializer)