在 TensorFlow 中初始化变量的最佳方法是什么?
What is the best way to initialize the Variable in TensorFlow?
在 TensorFlow 中,我可以通过两种方式初始化变量:
在声明变量之前调用global_variable_intializer()
:
import tensorflow as tf
# Initialize the global variable and session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
W = tf.Variable([.3], tf.float32)
x = tf.Variable([-.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
linear_model = W * x + b
声明变量后调用global_variable_intializer()
:
import tensorflow as tf
W = tf.Variable([.3], tf.float32)
x = tf.Variable([-.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
linear_model = W * x + b
# Initialize the global variable and session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
两者有什么区别?初始化变量的最佳方式是什么?
编辑
这就是我的实际程序 运行 :
import tensorflow as tf
# Initialize the global variable and session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = W * x + b
square_delta = tf.square(linear_model - y)
loss = tf.reduce_sum(square_delta)
fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))
这两个选项的区别在于第一个不起作用。尝试 sess.run(linear_model)
结果
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable_3
因此,毫不奇怪,您应该在创建变量后对其进行初始化。
您应该将 Tensorflow 视为图表,
与:
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
linear_model = W * x + b
您只是在描述您的张量流图。
如果你打印 linear_model 你将有一个没有值的张量等待图形到 运行: <tf.Tensor 'add:0' shape=(1,) dtype=float32>
Tensorflow 将 运行 您绘制图表并“导出”仅当 运行与 my value = sess.run(linear_model)
[= 进行会话时您想要的值13=]
这就是您应该考虑第二个解决方案的原因!
情况1,变量没有初始化,如果你尝试
sess.run(linear_model)
它应该给你一些错误(我的编译器上的 FailedPreconditionError)。
案例 2 是可行的。
命令
tf.global_variables_initializer()
应该在创建完所有变量后调用,否则会报同样的错误。
据我了解,每次调用 tf.Variable 时,与变量相关的节点都会添加到图中。这些是:
Variable/initial_value
Variable
Variable/Assign
Variable/read
(通过命令
获取目前构建的节点
for n in tf.get_default_graph().as_graph_def().node:
print n.name
)
变量本身没有任何值,直到您在 Variable/Assign 节点的会话中 运行。
命令
init = tf.global_variables_initializer()
创建一个包含所有变量的所有分配节点的单个节点,并将其关联到 python 变量 'init' 以便在执行时行
sess.run(init)
所有变量都获取初始值。
在 TensorFlow 中,我可以通过两种方式初始化变量:
在声明变量之前调用
global_variable_intializer()
:import tensorflow as tf # Initialize the global variable and session init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) W = tf.Variable([.3], tf.float32) x = tf.Variable([-.3], tf.float32) b = tf.Variable([-.3], tf.float32) linear_model = W * x + b
声明变量后调用
global_variable_intializer()
:import tensorflow as tf W = tf.Variable([.3], tf.float32) x = tf.Variable([-.3], tf.float32) b = tf.Variable([-.3], tf.float32) linear_model = W * x + b # Initialize the global variable and session init = tf.global_variables_initializer() sess = tf.Session() sess.run(init)
两者有什么区别?初始化变量的最佳方式是什么?
编辑
这就是我的实际程序 运行 :
import tensorflow as tf
# Initialize the global variable and session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
linear_model = W * x + b
square_delta = tf.square(linear_model - y)
loss = tf.reduce_sum(square_delta)
fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))
这两个选项的区别在于第一个不起作用。尝试 sess.run(linear_model)
结果
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable_3
因此,毫不奇怪,您应该在创建变量后对其进行初始化。
您应该将 Tensorflow 视为图表, 与:
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
linear_model = W * x + b
您只是在描述您的张量流图。
如果你打印 linear_model 你将有一个没有值的张量等待图形到 运行: <tf.Tensor 'add:0' shape=(1,) dtype=float32>
Tensorflow 将 运行 您绘制图表并“导出”仅当 运行与 my value = sess.run(linear_model)
[= 进行会话时您想要的值13=]
这就是您应该考虑第二个解决方案的原因!
情况1,变量没有初始化,如果你尝试
sess.run(linear_model)
它应该给你一些错误(我的编译器上的 FailedPreconditionError)。
案例 2 是可行的。
命令
tf.global_variables_initializer()
应该在创建完所有变量后调用,否则会报同样的错误。
据我了解,每次调用 tf.Variable 时,与变量相关的节点都会添加到图中。这些是:
Variable/initial_value
Variable
Variable/Assign
Variable/read
(通过命令
获取目前构建的节点for n in tf.get_default_graph().as_graph_def().node:
print n.name
)
变量本身没有任何值,直到您在 Variable/Assign 节点的会话中 运行。
命令
init = tf.global_variables_initializer()
创建一个包含所有变量的所有分配节点的单个节点,并将其关联到 python 变量 'init' 以便在执行时行
sess.run(init)
所有变量都获取初始值。