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

时间:2018-01-01 22:51:54

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

我主要在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中初始化和Variabalize?我知道这可能是一个基本问题,但它是R中没有解决的问题。

1 个答案:

答案 0 :(得分:3)

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

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()

...它会使你从样板文件中解脱出来,如上所述。