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

7

我主要使用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所涉及的内容。


1
因为您正在声明计算图并且必须声明变量(节点)及其初始值。我不确定您使用R做什么,但我几乎可以肯定R不会执行计算图。 - Umang Gupta
1个回答

6

让我们来看一下这个脚本实际上是做什么的:

spike = tf.Variable(False)

这行代码创建了一个符号变量或者说是计算图中的节点,它采用常量初始化。此时还没有为该变量分配内存,而且也不知道它会被放到CPU还是GPU上。
接下来,
spike.initializer.run()

这行代码在你已经启动的默认会话中运行spike初始化程序。

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

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

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

您可以这样启动它:

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

...并且它将为您节省模板代码,就像上面的例子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接