TensorFlow变量与TensorFlow张量的实现差异
首先,我知道有人提出了一个相关的问题 然而,这个问题是关于实现和内部的。 我在看报纸。这里引用了以下两点: 一, 张量本身不在内存中保存或存储值,但提供 仅用于检索张量引用的值的接口 这对我来说意味着,张量是一个简单地存储指向操作结果的指针的对象,在检索张量的结果或值时,它只是取消对该指针的引用 二, 变量可以描述为存储张量的内存缓冲区中的持久、可变句柄。因此,变量具有一定的形状和固定的类型 在这一点上,我感到困惑,因为基于上一点,我认为张量只是存储一个指针。如果它们只是指针,那么它们也可以是可变的 确切地说,我的问题如下:TensorFlow变量与TensorFlow张量的实现差异,tensorflow,Tensorflow,首先,我知道有人提出了一个相关的问题 然而,这个问题是关于实现和内部的。 我在看报纸。这里引用了以下两点: 一, 张量本身不在内存中保存或存储值,但提供 仅用于检索张量引用的值的接口 这对我来说意味着,张量是一个简单地存储指向操作结果的指针的对象,在检索张量的结果或值时,它只是取消对该指针的引用 二, 变量可以描述为存储张量的内存缓冲区中的持久、可变句柄。因此,变量具有一定的形状和固定的类型 在这一点上,我感到困惑,因为基于上一点,我认为张量只是存储一个指针。如果它们只是指针,那么它们也可以是可
在解释张量和变量之间的区别之前,我们应该明确“张量”一词在TensorFlow上下文中的含义:
- 在Python API中,对象表示TensorFlow操作的符号结果。例如,在表达式
中,t=tf.matmul(x,y)
是表示乘以t
和x
的结果的y
对象(其本身可能是其他操作的符号结果、具体值,例如NumPy数组或变量) 在这种情况下,“符号结果”比指向操作结果的指针更复杂。它更类似于一个函数对象,当调用它时(即传递给tf.Tensor
)将运行必要的计算以生成该操作的结果,并将其作为具体值返回给您(例如NumPy数组)tf.Session.run()
- 在C++API中,对象表示多维数组的具体值。例如,
内核将两个二维MatMul
对象作为输入,并生成一个二维tensorflow::Tensor
对象作为输出tensorflow::Tensor
Output
,对于具体值,我们更喜欢名称Tensor
)
变量也存在类似的区别。在pythonapi中,a是变量的符号表示形式,它具有用于创建读取变量当前值并为其赋值的操作的方法。在C++实现中,对象是一个共享的、可变的tensorflow::Tensor
对象包含指向内存中缓冲区的指针,该缓冲区保存该张量的值。缓冲区可以位于主机内存(即可从CPU访问)或设备内存(例如仅可从GPU访问)中,TensorFlow具有在这些内存空间之间移动数据的操作tf.Tensor
对象,使用“持久、可变句柄”表示tf.Variable
对象。TensorFlow代码库使用“handle”来表示有状态对象的名称(如tf.FIFOQueue
或tf.TensorArray
),无需复制所有值(即)tensorflow::Tensor
对象的定义最为匹配。(Python)tf.Tensor
对象更复杂,因为它指的是用于计算值的函数,而不是值本身tensorflow::Var
还有一个mutex
,可用于在更新变量时锁定该变量
在Python中,本质区别在于tf.Tensor
被实现为数据流图,并且是只读的(即通过调用tf.Session.run()
)。tf.变量
既可以读取(即通过评估其读取操作)也可以写入(例如通过运行赋值操作)
为什么它们的声明不同,为什么这种差异对TensorFlow至关重要?
张量和变量有不同的用途。张量(tf.Tensor
objects)可以表示数学表达式的复杂组合,如神经网络中的损失函数或符号梯度。变量表示随时间更新的状态,如训练期间的权重矩阵和卷积滤波器。原则上你可以代表