【问题标题】:Different outcomes when using tf.Variable() and tf.get_variable()使用 tf.Variable() 和 tf.get_variable() 时的不同结果
【发布时间】:2018-05-03 03:42:30
【问题描述】:

我正在尝试通过玩线性回归 (LR) 来熟悉来自 this site 的 TensorFlow 框架。 LR的源代码可以找到here,名称为03_linear_regression_sol.py

一般来说,LR的定义模型是Y_predicted = X * w + b,其中

  • wb 是参数(tf.Variable
  • Y_predictedX 是训练数据 (placeholder)

对于wb,在示例代码中,它们的定义如下

w = tf.Variable(0.0, name='weights')
b = tf.Variable(0.0, name='bias')

我将这两行代码稍作改动,如下所示

w = tf.get_variable('weights', [], dtype=tf.float32)
b = tf.get_variable('bias', [], dtype=tf.float32)

对于这个实验,我为这两个版本获得了两个不同的total_loss/n_samples。更具体地说,在原始版本中,我随时都能得到确定性结果,1539.0050282141283。但是,在修改后的版本中,我在不同的运行时间得到了不确定的结果,例如,total_loss/n_samples 可能是1531.30397938688591526.3752814714044,......等等。

tf.Variable()tf.get_variable() 有什么区别?

【问题讨论】:

    标签: python machine-learning tensorflow


    【解决方案1】:

    tf.Variable 在创建时接受一个初始值(常量),这解释了使用它时的确定性结果。

    tf.get_variable 略有不同:它有一个initializer 参数,默认为None,解释如下:

    如果initializerNone(默认值),则将使用在变量范围内传递的默认初始化程序。如果那个也是None,则将使用glorot_uniform_initializer

    由于您没有传递初始化程序,因此变量获得了统一的随机初始值。

    【讨论】:

    • 在执行阶段,我已经有了两个版本的代码行sess.run(tf.global_variables_initializer())。我认为这条线负责初始化变量,不是吗?无论如何,在为变量添加初始化器w = tf.get_variable('weights', [], dtype=tf.float32, initializer=tf.zeros_initializer)b = tf.get_variable('bias', [], dtype=tf.float32, initializer=tf.zeros_initializer) 之后,我得到了确定性值!太好了!
    • 是的,这一行 - sess.run(tf.global_variables_initializer()) - 运行所有变量的初始化程序。结果归结为这些初始化器是常量还是随机的。
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 2021-03-26
    • 2014-07-14
    • 1970-01-01
    • 2021-06-17
    • 2018-07-18
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多