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

2024-03-29 09:56:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在研究如何使用张量流,似乎无法理解变量到底是什么。我读过其他的资料,比如the official documentationthis blog post和其他一些关于这个社区的问题,但他们似乎并没有真正解释什么是张量流变量以及我们为什么使用它们。你知道吗

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


Tags: the功能numpy属性tensorflowdocumentationblog神经网络
2条回答

What would be stopping us from building neural networks simply using pure Python and NumPy Ndarrays?

什么都没有。嗯,除了时间、精力和技术,什么都没有。你知道吗

从概念上讲,变量就是:变量。就像你在其他程序中使用的任何东西一样。你知道吗

当然,你说得对:

that Variables in Tensorflow seem to have some properties or functionality that is unique to Tensorflow

例如:一个变量通常(尽管肯定不总是)“可训练的”。这意味着它不仅仅代表一个数字的占位符。使用该数字的操作由tensorflow“跟踪”,以便在backprop期间,可以根据损失函数的梯度和我们使用的任何优化器来调整该数字。你知道吗

这并不能真正改变这个概念。你知道吗

只是对Stewart_R已经说过的内容进行一点扩展。在大多数情况下,当您使用TensorFlow操作时,您使用的是张量(^{})。如果我写下:

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图(^{})中(这在急切模式下工作有点不同,但是让我们把它留到另一个场合)。你知道吗

不过,有时也会处理另一种实体,它们是变量(^{})。变量的关键特性是,它们可以保存在对session.run的不同调用之间的值。其工作原理是,用类型和大小声明它们,然后进行赋值操作。在会话中运行赋值操作时,该值将在会话中固定,直到执行新的赋值操作。变量要求您在会话中首次使用它们之前为它们赋值,因为创建会话时它们处于“空”状态。这就是初始化的目的。你知道吗

变量通常(但不是唯一的或必要的)用于保存可训练模型的参数。例如,如果你训练一个神经网络,你有几个“权重”要训练。在每个训练步骤上,调用session.run,然后使用一批示例执行优化步骤。显然,您希望下一步从上一步继续,因此需要在调用session.run之间保留参数值。你知道吗

另一方面,变量值只存在于会话中。当会话关闭时,值将消失。因此,您可以使用各种机制将变量值保存到会话之外,如checkpointssaved modelsHDF5 Keras filesgraph freezing。。。你知道吗

就像斯图尔特说的,你可以。问题是,要训练一个神经网络(或类似的东西),你需要计算你正在做的操作的梯度,而NumPy不提供现成的支持。虽然您可以使用autograd(请参见this example)之类的东西,但TensorFlow是从零开始构建的,并且非常支持它。类似的框架包括TheanoPyTorch。使用TensorFlow这样的框架也有它自己的额外优势,比如GPU支持(同样,NumPy也不是不可能,但也不是很简单)、多平台支持、分布式培训。。。当然,这些东西有某种趋势因素,谷歌的支持也有帮助,但TensorFlow在普通NumPy上有显著的好处。你知道吗

相关问题 更多 >