在TensorFlow中初始化变量的最佳方法是什么?

时间:2017-05-31 12:16:10

标签: python tensorflow tensor

在Tensorflow中,我可以用两种方式初始化变量:

  1. 在声明变量之前调用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)
    b = tf.Variable([-.3], tf.float32)
    b = tf.Variable([-.3], tf.float32)
    linear_model = W * x + b
    
  2. 在声明变量后调用global_variable_intializer

    import tensorflow as tf
    
    W = tf.Variable([.3], tf.float32)
    b = 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)
    
  3. 两者有什么区别?哪个是初始化变量的最佳方法?

    修改

    这是我正在运行的实际程序:

    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]}))
    

3 个答案:

答案 0 :(得分:5)

在案例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

变量本身在您在变量/分配节点的会话中运行之前没有任何价值。

命令

init = tf.global_variables_initializer() 

创建一个包含到目前为止构造的所有变量的所有赋值节点的单个节点,并将其与python变量'init'关联,以便在执行该行时

sess.run(init)

所有变量都获得初始值。

答案 1 :(得分:2)

两个选项之间的区别在于第一个选项不起作用。尝试sess.run(linear_model)会导致

  

FailedPreconditionError(参见上面的回溯):尝试使用未初始化的值Variable_3

因此,有些不足为奇,您应该在创建变量后初始化变量。

答案 2 :(得分:1)

您应该将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)

的会话时运行图表并“导出”您想要的值

这就是为什么你应该考虑你的第二个解决方案!