我主要在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中没有涉及到这个问题。
回答:
让我们来看看这个脚本实际上做了什么:
spike = tf.Variable(False)
这一行创建了一个符号变量或计算图中的一个节点,并使用常量初始化器。在这一点上,这个变量还没有分配任何东西。此外,甚至还不知道它将被放置在哪个设备(CPU或GPU)上。
接下来,
spike.initializer.run()
这一行在你已经启动的默认会话中运行spike
初始化器。
请注意,首先,尽管代码完全有效,但在实际应用中并不典型。更常见的是,职责分离:模型在一个或多个源文件中定义,并在另一个或多个文件中执行。初始化逻辑上属于后者,因为只有在会话开始时,内存才会被分配。
其次,常量并不是初始化变量的唯一选项。例如,Xavier初始化器需要整个图结构来计算输入和输出的连接数量,并从中推导出标准偏差。如果我们在定义期间尝试初始化变量,它根本不会工作。
我希望现在TensorFlow的设计变得更加清晰:初始化器确实是一个专用的操作。特别是对于你的用例,TensorFlow已经发布了急切模式,这是一种命令式、按运行定义的接口,其中操作在从Python调用时立即执行。
你可以这样启动它:
import tensorflow.contrib.eager as tfetfe.enable_eager_execution()
… 这样可以省去像上面的样板代码。