为什么我在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()

从外行的角度来看,为什么我在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()

… 这样可以省去像上面的样板代码。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注