【问题标题】:Why do I need to initialize variables in TensorFlow?为什么我需要在 TensorFlow 中初始化变量?
【发布时间】:2018-06-11 17:48:54
【问题描述】:

我主要使用 R 开发模型,目前正在学习 TensorFlow。 我正在使用以下代码完成教程

raw_data = [1., 2., 8., -1., 0., 5.5, 6., 13] 
spike = tf.Variable(False)
spike.initializer.run()

for i in range(1, len(raw_data)): 
    if raw_data[i] - raw_data[i-1] > 5:
        updater = tf.assign(spike, True)
        updater.eval()
    else:
        tf.assign(spike, False).eval()
    print("Spike", spike.eval())
sess.close()

从外行的角度来看,为什么我需要在 TensorFlow 中进行初始化和变量化?我知道这可能是一个基本问题,但它在 R 中没有处理。

【问题讨论】:

  • 因为你要声明一个计算图,你必须声明变量(节点)和它们的初始值。我不确定你用 R 做什么,但我几乎可以肯定 R 不做计算图。

标签: python variables tensorflow machine-learning artificial-intelligence


【解决方案1】:

让我们看看脚本实际做了什么:

spike = tf.Variable(False)

这一行在计算图中创建了一个符号变量或一个节点,带有一个常量初始化器。此时,没有为这个变量分配任何东西。最重要的是,甚至还不知道它将被放置在哪个设备(CPU 或 GPU)上。

接下来,

spike.initializer.run()

此行在您已经启动的默认会话中运行spike 初始化程序。

请注意,首先,尽管代码完全有效,但在实际应用中并不典型。更常见的是职责分离:模型在一个或多个源文件中定义,并在另一个或多个文件中执行。初始化逻辑上属于后者,因为只有在会话开始时才会分配内存。

其次,const 不是初始化变量的唯一选项。例如,Xavier initializer 需要有全图结构来计算传入和传出连接的数量,并从中推导出标准差。如果我们在定义过程中尝试初始化变量,它根本就行不通。

我希望现在 tensorflow 设计变得更加清晰:初始化器一个专用的操作。 tensorflow 专门针对您的用例发布了 eager mode,这是一个命令式、运行时定义的接口,当从 Python 调用操作时,它们会立即执行。

你可以这样开始:

import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()

...它会让你从样板文件中拯救出来,就像上面一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多