Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tf.constant\u initializer()与tf.global\u variables\u initializer()的比较_Python_Tensorflow - Fatal编程技术网

Python tf.constant\u initializer()与tf.global\u variables\u initializer()的比较

Python tf.constant\u initializer()与tf.global\u variables\u initializer()的比较,python,tensorflow,Python,Tensorflow,在以下来自网站的代码中,tf.constant\u initializer(0.)和tf.global\u variables\u 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.constant\u initializer(0.)和
tf.global\u variables\u 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_变量的初始值设定项属性指向 const_init_节点,但这只是在中的节点之间添加了一个新连接 图表。我们尚未对异常的根源进行任何处理: 与变量节点关联的内存(存储在 会话(而不是图形!)仍设置为“null”。我们需要这次会议 告诉const_init_节点实际更新变量


。。。这似乎仍然令人困惑,因为在这种情况下,我们为什么需要
tf.constant\u初始值设定项(0.)
?在运行
tf.global\u variables\u initializer()

之前,我们最好不要初始化
m
b
常量\u初始值设定项
基本上是一条“指令”,说明变量在实际完成后应如何初始化。即,是否应使用常量值、随机均匀值、随机正常值…
传递该值并不意味着此时将使用常量值初始化变量。如果您没有传递初始值设定项,
get\u variable
使用默认值(
glorot\u uniform
,我相信)

另一方面,
global\u variables\u initializer
是一个操作,一旦在会话中运行,它将实际执行初始化操作,然后调用执行在创建变量时传递给变量的初始化器。您总是需要运行op来初始化变量,因为正如前面提到的,仅仅在构造函数中传递初始值设定项实际上没有任何作用。

关于初始化变量可能会有所帮助

下面三样东西来自TensorFlow网站,也很有用。
:获取具有这些参数的现有变量或创建新变量。
:生成具有常量值的张量的初始值设定项。
:返回初始化全局变量的Op


简单地说,
tf.constant\u初始值设定项的作用是生成常量值。
tf.global\u variables\u initializer
的作用是初始化变量。在TensorFlow中,您应该在创建图形和会话之前初始化变量。因此,在使用变量时,必须使用
tf.global\u variables\u初始值设定项


实际上,在代码中,您不必使用
tf.constant\u初始值设定项
,因为
tf.get\u variable
将默认初始值设定项用作
glorot\u uniform\u初始值设定项

import tensorflow as tf

m = tf.get_variable("m", [])
b = tf.get_variable("b", [])
init = tf.global_variables_initializer()

y = m + b

sess = tf.Session()
sess.run(init)
sess.run(y)
但是您应该使用
tf.global\u variables\u初始值设定项
,因为
tf.get\u variable
获取变量或创建变量


示例代码1:如果不使用
tf.global\u variables\u初始值设定项
,则会遇到错误消息

import tensorflow as tf

m = tf.get_variable("m", [])
b = tf.get_variable("b", [])

y = m + b

sess = tf.Session()
sess.run(y)
示例代码2:您不必使用
tf.constant\u初始值设定项

import tensorflow as tf

m = tf.get_variable("m", [])
b = tf.get_variable("b", [])
init = tf.global_variables_initializer()

y = m + b

sess = tf.Session()
sess.run(init)
sess.run(y)

最后,即使在
tf.get\u variable
中使用
tf.constant\u初始值设定项
,也应该使用
tf.global\u variables\u初始值设定项
。原因是
tf.get\u variable
是一个变量。因此,您可以使用
tf.global\u variables\u初始值设定项在
tf.Session
之前初始化变量

import tensorflow as tf

m = tf.get_variable("m", [])
b = tf.get_variable("b", [])
init = tf.global_variables_initializer()

y = m + b

sess = tf.Session()
sess.run(init)
sess.run(y)

当使用
tf.global\u variables\u initializer
初始化变量时,也许您可以将
tf.get\u variable
中的
初始化器
(例如
tf.constant\u initializer
glorot\u uniform\u initializer
)看作是通过某种分布初始化值

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

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\u variables\u initializer
tf.constant\u initializer
之间的区别,它们是完全不同的:

  • tf.global\u variables\u initializer
    是一个用于初始化图形中所有变量的操作。使用
    tf.constant\u initializer
    tf.random\u normal\u initializer
    tf.glorot\u uniform\u initializer
    初始化变量并不重要。只需将该操作传递给
    tf.Session
    ,即可初始化图形变量

  • 另一方面,
    tf.constant\u初始值设定项
    只是传递给图形的
    tf.Variable
    的初始值设定项。然后,当
    tf.Session
    运行操作
    tf.global\u variables\u initializer
    时,tf图将使用
    tf.constant\u initializer
    使用提供的常量值初始化相应的
    tf.Variable


IMHO您所说的这一点是错误的“实际上,在您的代码中,您不必使用
tf.constant\u初始值设定项
,因为
tf.get\u variable
使用默认初始值设定项作为
tf.glorot\u uniform\u初始值设定项
”。使用常量初始值设定项的意义在于,如果您想在开始时修复一些
tf.Variable
值。假设我想做一个实验,在这里我想测量