为什么我需要在TensorFlow中初始化变量?

Dat*_*aTx 7 python variables artificial-intelligence machine-learning tensorflow

我主要在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()
Run Code Online (Sandbox Code Playgroud)

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

Max*_*xim 6

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

spike = tf.Variable(False)
Run Code Online (Sandbox Code Playgroud)

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

下一个,

spike.initializer.run()
Run Code Online (Sandbox Code Playgroud)

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

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

其次,const 不是初始化变量的唯一选项。例如,Xavier 初始化器需要具有整个图结构来计算传入和传出连接的数量,并从中推导出标准偏差。如果我们试图在定义期间初始化变量,它根本无法工作。

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

你可以这样开始:

import tensorflow.contrib.eager as tfe
tfe.enable_eager_execution()
Run Code Online (Sandbox Code Playgroud)

...它会像上面一样将您从样板中拯救出来。