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
值。假设我想做一个实验,在这里我想测量