【问题标题】:What is the best way to initialize the Variable in TensorFlow?在 TensorFlow 中初始化变量的最佳方法是什么?
【发布时间】:2017-11-01 05:56:06
【问题描述】:

在 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)
    x = 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)
    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]}))

【问题讨论】:

    标签: python tensorflow tensor


    【解决方案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) 运行会话时所需的值

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

    【讨论】:

      【解决方案2】:

      情况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
      

      )

      变量本身没有任何价值,直到您在 Session 中运行 Variable/Assign 节点。

      命令

      init = tf.global_variables_initializer() 
      

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

      sess.run(init)
      

      所有变量都获取初始值。

      【讨论】:

        【解决方案3】:

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

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

        因此,不出所料,您应该在创建变量后对其进行初始化。

        【讨论】:

        • 我已经用实际程序编辑了这个问题。尝试运行它。
        • 在您的程序中,您添加了一些 tf.assign,这会有所作为。
        • 它之所以有效,是因为您手动运行将值与变量相关联的节点分配
        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2016-09-17
        • 1970-01-01
        相关资源
        最近更新 更多