TensorFlow中的变量到底是什么?为什么要使用它们?

时间:2019-07-24 01:19:19

标签: python tensorflow

我目前正在研究如何使用TensorFlow,似乎无法完全理解Variable到底是什么。我已经阅读了the official documentationthis blog post之类的其他资源以及有关该社区的其他一些问题,但它们似乎并未真正解释TensorFlow变量是什么以及我们为什么使用它们。

我的理解是TensorFlow中的变量似乎具有一些TensorFlow特有的属性或功能(例如,当我们运行TensorFlow会话时),但是我不确定是否确实如此。是什么会阻止我们仅使用纯Python和NumPy Ndarrays构建神经网络?

2 个答案:

答案 0 :(得分:2)

  

什么会阻止我们仅使用纯Python和NumPy Ndarrays构建神经网络?

一无所有。好吧,除了时间,精力和专业知识之外什么都没有。

从概念上说,变量就是这样:一个变量。就像您要在其他程序中使用的任何东西一样。

当然,您正确地说:

  

Tensorflow中的变量似乎具有一些Tensorflow特有的属性或功能

作为一个例子:一个变量通常(尽管不一定总是)是“可训练的”。这意味着它不仅代表数字的占位符。张量流会“跟踪”使用该数字的操作,以便在反向传播期间可以根据损失函数的斜率以及我们使用的任何优化程序来调整该数字。

这并没有真正改变概念。

答案 1 :(得分:2)

只需对Stewart_R所说的内容进行扩展。在大多数情况下,当您使用TensorFlow操作时,您将使用张量(即tf.Tensor)。如果我写的话,这些是“不变的”。

c = tf.add(a, b)

然后,新张量c总是将添加ab的结果。现在,ab可以每次都不同(例如,如果它们是您为其输入值的占位符),但是c总是添加它们的结果。因此,在每次对session.run的调用中,如果其他所有条件都相同,则c将会始终相同。

与NumPy不同,您无法执行以下操作:

c[2] = 3

如果要创建“类似于c的张量,但索引2更改为值3”,则必须从字面上创建一个新的张量(这是常见的问题)。不过,不要将其与以下操作混淆:

c = something_else()

现在c将包含对something_else()的结果的引用,但tf.add(a, b)所得到的原始张量仍将存在于TensorFlow图(tf.Graph)中(这在渴望模式下有点不同,但让我们将其留给其他场合)。

但是,有时您还会处理另一种实体,它们是变量(tf.Variable)。变量的主要特征是它们可以保存在对session.run的不同调用之间保留的值。它的工作方式是,用类型和大小声明它们,然后进行赋值操作。在会话中运行分配操作时,该值将在会话中固定,直到执行新的分配操作为止。变量要求您在会话中首次使用它们之前为它们分配一个值,因为在创建会话时,它们处于“空”状态。这就是初始化的目的。

变量通常(但不是排他性地或必需地)用于保存可训练模型的参数。例如,如果您训练神经网络,则需要训练多个“权重”。在每个训练步骤中,调用session.run,然后使用一批示例执行优化步骤。显然,您希望下一步从上一步开始进行,因此您需要在对session.run的调用之间保留参数的值。

另一面是变量值仅存在于会话中。会话关闭时,值消失了。因此,您有各种各样的机制可以将变量值保存到会话外,例如checkpointssaved modelsHDF5 Keras filesgraph freezing ...

大约可以使用NumPy,就像Stewart所说的那样。问题是,要训练一个神经网络(或类似的东西),您需要计算所执行操作的梯度,而NumPy则不提供对此的支持。虽然您可以使用类似autograd(请参见this example)的方法,但TensorFlow的构建是从头开始的,并且非常支持。类似的框架包括TheanoPyTorch。使用诸如TensorFlow之类的框架还具有其自身的额外优势,例如GPU支持(同样,使用NumPy并非不可能,但并不简单),多平台支持,分布式培训...当然,这些是趋势因素事物,并得到Google的支持是有帮助的,但与普通的NumPy相比,TensorFlow具有明显的优势。