TensorFlow变量和TensorFlow张量之间的实现差异
tensorflow
6
0

首先,我知道这里已经提出一个相关的问题。

但是,此问题与实现和内部有关。我正在阅读论文“ TensorFlow之旅 ”。从此处引用以下两点:

1。

张量本身并不在内存中保存或存储值,而仅提供用于检索张量引用的值的接口。

这向我表明,张量是一个对象,它仅存储指向操作结果的指针,并且在检索张量的结果或值时,它仅取消引用该指针。

2。

变量可以描述为存储张量的内存中缓冲区的持久可变变量句柄。这样,变量以某种形状和固定类型为特征。

对此我感到困惑,因为基于上述观点,我认为张量只是存储一个指针。如果它们只是指针,它们也可能是可变的。

确切地说,这些是我的问题:

  1. “内存缓冲区”是什么意思?
  2. “句柄”是什么意思?
  3. 我对张量的内部的最初假设正确吗?
  4. 张量和变量之间的基本内部实现区别是什么?为什么它们声明不同,为什么这种差异对TensorFlow至关重要?
参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

在解释张量和变量之间的区别之前,我们应该精确地了解“张量”一词在TensorFlow上下文中的含义:

  • Python API中tf.Tensor对象表示TensorFlow操作的符号结果。例如,在表达式t = tf.matmul(x, y)t是一个tf.Tensor对象,表示xy相乘的结果(它们本身可能是其他运算的符号结果,例如NumPy数组,或变量)。

    在这种情况下,“符号结果”比指向操作结果的指针更为复杂。它更类似于一个函数对象,当调用该函数对象(即传递给tf.Session.run() )时,它将运行必要的计算以生成该操作的结果,并将其作为具体值返回给您(例如NumPy数组)。

  • C ++ API中 ,一个tensorflow::Tensor对象表示多维数组的具体值。例如, MatMul内核将二维的tensorflow::Tensor对象作为输入,并生成单个二维的tensorflow::Tensor对象作为其输出。

这种区别有点令人困惑,如果重新开始,我们可能会选择其他名称(在其他语言API中,对于符号结果,我们更喜欢名称为Output ;对于具体值,我们更喜欢名称为Tensor )。

变量也有类似的区别。在Python API中, tf.Variable是变量的符号表示,它具有创建操作的方法,这些操作可以读取变量的当前值并为其分配值。在C ++实现中, tensorflow::Var对象是围绕共享的可变tensorflow::Tensor对象的包装。

有了这种背景,我们可以解决您的特定问题:

  1. “内存缓冲区”是什么意思?

    内存中缓冲区只是已使用TensorFlow分配器分配的内存连续区域。 tensorflow::Tensor对象包含一个指向内存缓冲区的指针,该缓冲区保存该张量的值。缓冲区可以在主机内存(即,可从CPU访问)或设备内存(例如,仅可从GPU访问)中,并且TensorFlow具有在这些存储空间之间移动数据的操作。

  2. “句柄”是什么意思?

    在说明的纸张 ,守信用“手柄”在几个不同的方式,这是从TensorFlow如何使用期限略有不同使用。本文使用“符号句柄”来引用tf.Tensor对象,并使用“持久可变的句柄”来引用tf.Variable对象。 TensorFlow代码库使用“句柄”来引用有状态对象(例如tf.FIFOQueuetf.TensorArray )的名称,该名称可以在不复制所有值的情况下传递(即按引用调用 )。

  3. 我对张量内部的最初假设正确吗?

    您的假设与(C ++) tensorflow::Tensor对象的定义tensorflow::Tensor 。 (Python) tf.Tensor对象更加复杂,因为它引用的是用于计算值的函数,而不是值本身。

  4. 张量和变量之间的基本内部实现区别是什么?

    在C ++中, tensorflow::Tensortensorflow::Var非常相似;唯一不同的是tensorflow::Var还具有一个mutex ,可用于在更新变量时锁定该变量。

    在Python中,本质区别在于tf.Tensor被实现为数据流图,并且它是只读的(即,通过调用tf.Session.run() )。 tf.Variable既可以读取(即通过评估其读取操作),也可以写入(例如通过运行分配操作)。

    为什么它们声明不同,为什么这种差异对TensorFlow至关重要?

    张量和变量有不同的用途。张量( tf.Tensor对象)可以表示数学表达式的复杂组成,例如神经网络中的损失函数或符号梯度。变量表示随时间更新的状态,例如训练过程中的权重矩阵和卷积滤波器。虽然原则上可以表示不带变量的模型的演化状态,但最终会得到非常大(且重复)的数学表达式,因此变量提供了一种便捷的方法来实现模型的状态,例如共享与其他机器进行并行训练。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号